POJ 1888 Crossword Answers

問題

クロスワードパズルの図が与えられる。
縦のキーワードと横のキーワードを、番号をつけて出力せよ。


縦のキーワードの開始位置となるのは、
最初の行の文字のマス、あるいは一つ上が黒いマスである文字のマスであり、
横のキーワードの開始位置となるのは、
最初の列の文字の増す、あるいは一つ左が黒いマスである文字のマスである。


キーワードの番号は、1からはじまって、
左上から右に順にキーワードが現れるたびに1ずつ増やした番号。

制約条件

行,列≦10

方針

ソースコード

int h,w;
char in[11][11];
int cnt[11][11];

int main()
{
	int cs=0;
	while(scanf("%d",&h),h){
		scanf("%d",&w);
		rep(i,h)scanf("%s",in[i]);
		rep(i,h)rep(j,w)cnt[i][j]=0;
		
		int k=1;
		rep(i,h)rep(j,w)if(in[i][j]!='*'){
			if(i==0||i&&in[i-1][j]=='*')cnt[i][j]=k++;
			else if(j==0||j&&in[i][j-1]=='*')cnt[i][j]=k++;
		}
		printf("puzzle #%d:\n",++cs);
		puts("Across");
		rep(i,h)rep(j,w)if(cnt[i][j]&&(j==0||in[i][j-1]=='*')){
			int sz=0;
			char str[11]={};
			for(int l=j;l<w&&in[i][l]!='*';l++)str[sz++]=in[i][l];
			printf("% 3d.%s\n",cnt[i][j],str);
		}
		puts("Down");
		rep(i,h)rep(j,w)if(cnt[i][j]&&(i==0||in[i-1][j]=='*')){
			int sz=0;
			char str[11]={};
			for(int l=i;l<h&&in[l][j]!='*';l++)str[sz++]=in[l][j];
			printf("% 3d.%s\n",cnt[i][j],str);
		}
		puts("");
	}
	return 0;
}