您的位置:首页 > 其它

UVa 232 - Crossword Answers

2016-12-19 20:57 435 查看
输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出

了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,如图3-7所示。



接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。

这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。

#include <stdio.h>
#include <string.h>
char s[10][10];
int flag[10][10];
int flag1[10][10]; /*竖着输出时的标志*/

int main()
{
int r,c,id,k;
id = 0;
scanf("%d",&r);
while(1)
{
id++;
scanf("%d",&c);
memset(flag,0,sizeof(flag));
memset(flag1,0,sizeof(flag1));
k = 1;
for(int i = 0; i < r; i++)
{
getchar(); //避免换行符号对下面scanf("%c",&s[i][j])的影响
for(int j = 0; j < c; j++)
{
scanf("%c",&s[i][j]);
if(s[i][j] != '*')
{
if(i == 0 || j == 0 || s[i-1][j] == '*' || s[i][j-1] == '*')
{
flag[i][j] = k;
k++;
}
}
}
}
printf("puzzle #%d:\n",id);
printf("Across\n");
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c;)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
while(j < c && s[i][j] != '*')
{
if(j+1 < c && s[i][j+1] != '*') //格式要求
printf("%c",s[i][j]);
else
printf("%c\n",s[i][j]);
j++;
}
}
j++;
}
}
printf("Down\n");
for (int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
if(flag1[i][j] == 0)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
int k = 0;
while(i+k < r && s[i+k][j] != '*')
{
if(i+k+1 < r && s[i+k+1][j] != '*') //格式要求
printf("%c",s[i+k][j]);
else
printf("%c\n",s[i+k][j]);
flag1[i+k][j] = 1;
k++;
}
}
}
}
}
scanf("%d",&r);
if(r != 0)
printf("\n");
else
break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: