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