输入一个输入一个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;
}
//本题主要是将两张表看待成一张表来分析,关键之处在与前期数值的标记,以及最后纵向数出的
//本题是典型的利用二维数组的水题, 计算不复杂,但要小心边界