UVa232 ACM/ICPC 1994 纵横字谜的答案

来源:互联网 发布:淘宝详情页私单价格 编辑:程序博客网 时间:2024/04/29 13:11
输入一个输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…。接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。
#include <stdio.h>  #include <string.h>      int main(void)  {      char buf[12][12];//用来存储字母      int num[12][12];//用来存放数字      int r,c;      int count=1,i,j;       while(scanf("%d",&r) && r!=0)      {          scanf("%d",&c);          memset(num,0,sizeof(num));          for(i=0;i<r;i++)              scanf("%s",buf[i]);          int m=1;          for(i=0;i<r;i++)          {              for(j=0;j<c;j++)              {                  if(buf[i][j]=='*')//如果这个位置是黑格,不用填                      continue;                  if((j-1)<0 || buf[i][j-1]=='*' || (i-1)<0 || buf[i-1][j]=='*')                  {  //这个位置的上面或左面是黑格或是边界,开始往num填数字                     num[i][j]=m++;                  }              }          }  if(count!=1)printf("\n");  //第一次不用换行,来处理每两个数据间一个空行,最后一个无空行         printf("puzzle #%d:\n",count++);          printf("Across\n");//接下来开始打印横行          for(i=0;i<r;i++)            {              int j=0;              while(j<c)              {                  if(num[i][j] == 0 || buf[i][j] =='*')                  {                      j++;  //如果这是个黑格或是中间无值格,跳过这一次                     continue;                  }                     printf("%3d.%c",num[i][j],buf[i][j]);//格式需要                  j++;                  while(j<c && buf[i][j]!='*')//当输出到行结尾时结束或是黑格时                  {                      printf("%c",buf[i][j]);                      j++;                   }                  printf("\n");              }          }          printf("Down\n");//接下来打印竖行          for(i=0;i<r;i++)            {              for(j=0;j<c;j++)              {                  if(num[i][j] == 0 || buf[i][j]=='*')                      continue;   //如果这是个黑格或是中间无值格,跳过这一次                 printf("%3d.%c",num[i][j],buf[i][j]);                  num[i][j]=0;                  int k=i+1;                  while(k<r && buf[k][j]!='*') //当输出到行结尾时结束或是黑格时                  {                      printf("%c",buf[k][j]);                      num[k][j]=0;  //将其中的数归0,这是为了完成上上个注释所在行的代码                     k++;                  }                  printf("\n");              }          }      }      return 0;  }  //本题主要是将两张表看待成一张表来分析,关键之处在与前期数值的标记,以及最后纵向数出的//本题是典型的利用二维数组的水题, 计算不复杂,但要小心边界


1 0