PKU 1888 Crossword Answers
http://poj.org/problem?id=1888
完成したクロスワードが与えられるので、出現する単語を縦と横にまとめて、番号をちゃんとつけて出力するというような問題。
微妙に変数名がおかしかったりしますが、気にしないでください。
string in[10]; int num[10][10]; main(){ int r,c; int pu=0; while(cin>>r,r){ ++pu; cout<<"puzzle #"<<pu<<':'<<endl; cin>>c; memset(num,0,sizeof(num)); int nu=1; rep(i,r){ cin>>in[i]; rep(j,c){ if(in[i][j]=='*')continue; if(i==0 || j==0 || in[i-1][j]=='*' || in[i][j-1]=='*'){ num[i][j]=nu++; } } } map<int,string> acr,dow; rep(i,r){ rep(j,c){ if(num[i][j]==0)continue; if(i==0 || in[i-1][j]=='*'){ int cx=i; while(cx<r && isalpha(in[cx][j]))acr[num[i][j]]+=in[cx++][j]; } if(j==0 || in[i][j-1]=='*'){ int cy=j; while(cy<c && isalpha(in[i][cy]))dow[num[i][j]]+=in[i][cy++]; } } } cout<<"Across"<<endl; FOR(miter,dow)printf(" %2d.",miter->F),cout<<miter->S<<endl; cout<<"Down"<<endl; FOR(miter,acr)printf(" %2d.",miter->F),cout<<miter->S<<endl; cout<<endl; } }