纵横字谜的答案(Uva232)
题目UVa232,题目考察点时二维数组的使用。注意点是需要读懂题目意思,关键点是起始格需要用额外用一个数组存储。然后根据横向和纵向单词的定义,结合起始格,循环遍历打印输出即可。
纵向输出需要额外注意,是先从行开始,找出一个纵向单词,然后转到下一列,直到最后一列,然后再从第二行开始,重复以上步骤。为了防止重复输出,需要把遍历过的位置置0。
#include <cstdio>
#include <cstring>
int main()
{
int r, c;
char p[12][12]; //字符数组
int no[12][12]; //起始格位置记号
int count = 0;
while (scanf("%d%d\n", &r, &c) == 2 && r)
{
memset(no, 0, sizeof(no)); //初始化0
count++; //记录题目组个数
int pos = 1; //起始格初值
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
scanf("%c", &p[i][j]);
if (p[i][j] == '*') //跳过黑格
{
continue;
}
if (j < 1 || p[i][j - 1] == '*' || i < 1 || p[i - 1][j] == '*') //左边相邻位置或者上边没有空格。
{
no[i][j] = pos++;
}
}
getchar(); //吸收换行符
}
if (count != 1) //每组题目换行隔开
{
printf("\n");
}
printf("puzzle #%d:\n", count);
printf("Across\n");
//横向输出
for (int i = 0; i < r; i++)
{
int j = 0;
while (j < c)
{
if (p[i][j] == '*' || no[i][j] == 0)
{
j++;
continue;
}
printf("%3d.%c", no[i][j], p[i][j]);
j++;
while (j < c && p[i][j] != '*')
{
printf("%c", p[i][j]);
j++;
}
printf("\n");
}
}
/**纵向输出:以行为开始,以列为单词,
* 顺序是,先从第一行,按列递增,找出改列的word。
* 然后在从第二行,按列递增,找出改列的word。
* ...
* 所以在遍历过后,就要将该位置的no起始格置0.
*/
printf("Down\n");
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (p[i][j] == '*' || no[i][j] == 0)
{
continue;
}
printf("%3d.%c", no[i][j], p[i][j]);
no[i][j] = 0;
int k = i + 1;
while (k < r && p[k][j] != '*')
{
printf("%c", p[k][j]);
no[k][j] = 0;
k++;
}
printf("\n");
}
}
}
}