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; }