Crossword Answers

来源:互联网 发布:巴黎文华东方酒店知乎 编辑:程序博客网 时间:2024/05/15 02:36

Crossword Answers

Think:
题目大意是一个棋盘里有黑色和白色的白块,如果一个白色的白块的左边或者上边是黑色的或者是边界,则白块被标记,序号从左到右,从上到下,依次增大。
然后遍历,遇到序号,把序号和这个白块到边界或者黑块之间的字符输出。遍历是先横后纵。
%%%注意,这题的坑点是:(第一组除外)每一组的前面都有一个空白行(遇到了PE,竟不知道哪里错了,找了好久……)!!!

#include <bits/stdc++.h>using namespace std;char a[121][121];//存字符int b[121][121];//存序号int c[121][121];//是否访问过int main(){   int n, m;   int t = 1;   while(~scanf("%d", &n)&&n)   {   scanf("%d", &m);   getchar();      for(int i=1;i<=n;i++)      {        for(int j=1;j<=m;j++)        {            scanf("%c", &a[i][j]);            b[i][j] = 0;            c[i][j] = 0;        }        getchar();      }      int top = 1;      for(int i=1;i<=n;i++)      {         for(int j=1;j<=m;j++)         {            if((i==1||j==1)&&a[i][j]!='*')            {              b[i][j] = top++;            }            else if((a[i-1][j]=='*'||a[i][j-1]=='*')&&a[i][j]!='*')            {              b[i][j] = top++;            }         }      }      if(t!=1)      cout<<endl;      cout<<"puzzle #"<<t++<<':'<<endl;      cout<<"Across"<<endl;      for(int i=1;i<=n;i++)      {          for(int j=1;j<=m;j++)          {            if(b[i][j]!=0)            {              printf("%3d.", b[i][j]);              for(;j<=m;j++)              {                if(a[i][j]=='*')                break;                else                cout<<a[i][j];              }              cout<<endl;            }          }      }      cout<<"Down"<<endl;      for(int i=1;i<=n;i++)      {        for(int j=1;j<=m;j++)        {          if(b[i][j]!=0&&c[i][j]==0)          {            printf("%3d.", b[i][j]);            int k = i;            for(;k<=n;k++)            {              if(a[k][j]=='*')              break;              else              {              if(c[k][j]==0)              {               c[k][j] = 1;               cout<<a[k][j];              }              }            }            cout<<endl;          }        }      }   }    return 0;}
原创粉丝点击