UVA 232 Corssword Answer

题意:输入m*n大小的字符串(里面有*,*为黑格,其他为白格),然后对它编号,编号规则为从左到右,从上往下,且左边或上面没有白格(可能是黑格或越界),如下图:

注意:

①除第一次输出答案外,其余每次输出前要加换行。

②down的输出需要按照编号的顺序输出,而不是真的按位置从上到下。

③判断结束是遇到*和访问越界,判断开始是看前一个是不是*(Cross和Down只是i,j减一的不同)和访问开始(i==0)

附上一个样例:它的cross和down分别是:

所以down的输出是从左往右,从上到下的寻找非*的位置,找到后从此位置往下输出,遇到越界和*则结束此次输出,

例如:找到A,输出A,然后找到I,输出IMPOSE,然后找到M,输出MEO。

所以判断结束是越界和*,而判断开始是*和i==0。

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 #include "string.h"
  4 int num[10][10];
  5 char str[10][10];
  6 int judge(int i,int j)
  7 {
  8     if(str[i][j]=='*')
  9         return -1;
 10     if(i==0||j==0)//边界
 11         return 1;
 12     if(str[i-1][j]=='*'||str[i][j-1]=='*')//左或上为*
 13         return 1;
 14     return 0;
 15 }
 16 int main()
 17 {
 18     int n,m,i,j,k,count=0,countNum=0,returnValue;
 19     int printfNum=1;
 20     char c;
 21     while(scanf("%d",&m)&&m)
 22     {
 23         scanf("%d",&n);
 24         count++;
 25 //        if(count!=1)
 26 //            printf("\n");//这两句写在这里也可以
 27         printfNum=1;
 28         countNum=0;
 29         for(i=0;i<m;i++)
 30         {
 31             c=getchar();//取换行符
 32             for(j=0;j<n;j++)
 33             {
 34                 scanf("%c",&str[i][j]);
 35             }
 36         }
 37 
 38         //编号
 39         countNum++;
 40         memset(num,0,sizeof(num));//初始化为0
 41         for(i=0;i<m;i++)
 42         {
 43             for(j=0;j<n;j++)
 44             {
 45                 //判断,>0->非*,-1->*,0->在边界
 46                 returnValue=judge(i,j);
 47                 if(returnValue==1)
 48                 {
 49                     num[i][j]=countNum;
 50                     countNum++;
 51                 }
 52                 else{
 53                       if(returnValue==-1)
 54                             num[i][j]=-1;
 55                     }
 56             }
 57         }
 58 //        printf("num:\n");
 59 //        for(i=0;i<m;i++)
 60 //        {
 61 //            for(j=0;j<n;j++)
 62 //                printf("%-3d",num[i][j]);
 63 //            printf("\n");
 64 //        }
 65         //输出结果
 66         if(count!=1)
 67             printf("\n");
 68         printf("puzzle #%d:\n",count);
 69         printf("Across\n");
 70         for(i=0;i<m;i++)
 71         {
 72             for(j=0;j<n;j++)
 73             {
 74                 if((j==0||num[i][j-1]==-1)&&num[i][j]>0)
 75                 {
 76                     printf("%3d.",num[i][j]);
 77                     for(k=j;k<n;k++)
 78                     {
 79                         printf("%c",str[i][k]);//如果和下面的if交换就无法判断边界了
 80                         if(num[i][k+1]==-1||k==n-1)
 81                         {
 82                             printf("\n");
 83                             break;
 84                         }
 85                     }
 86                 }
 87             }
 88         }
 89 //        for(i=0;i<m;i++)//这种写法WA
 90 //        {
 91 //            for(j=0;j<n;j++)
 92 //            {
 93 //                if(printfNum==1&&num[i][j]>0)
 94 //                {
 95 //                    if(num[i][j]!=1)
 96 //                        printf("\n");
 97 //                    printf("%3d.",num[i][j]);
 98 //                    printfNum=-printfNum;
 99 //                }
100 //                if(str[i][j]!='*')
101 //                {
102 //                    printf("%c",str[i][j]);
103 //                }
104 //                else
105 //                {
106 //                    printfNum=1;
107 //                }
108 //            }
109 //            printfNum=1;
110 //        }
111         printf("\n");
112         printfNum=1;
113         printf("Down\n");
114         for(i=0;i<m;i++)
115         {
116             for(j=0;j<n;j++)
117             {
118                 if((i==0||num[i-1][j]==-1)&&num[i][j]>=0)
119                 {
120                     printf("%3d.",num[i][j]);
121                     for(k=i;k<m;k++)
122                     {
123                         printf("%c",str[k][j]);
124                         if(num[k+1][j]==-1||k==m-1)
125                         {
126                             printf("\n");
127                             break;
128                         }
129                     }
130                 }
131             }
132         }
133 
134     }
135     return 0;
136 }

  

猜你喜欢

转载自www.cnblogs.com/fudanxi/p/10282715.html