题目大意:输入黑白网格,白格都有字母。如果一个白格的左边或上方是黑格或边界,则这个白格是起始格。将起始格从第一行开始,从左到右进行编号。出横向和纵向单词,单词以起始格开始,碰到黑格或边界结束。
解题思路:用二维数组 map 记录网格,再用一个二维数组 num 数组记录起始格,遍历判断是否为起始格,是则输出编号,并从 map 对应位置开始输出单词。
注意编号宽度为 3,两个样例之间有一个空行。
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
char map[105][105];
int num[105][105];
int count = 0;
int main() {
int r, c;
while (scanf("%d", &r) && r != 0) {
count++;
scanf ("%d", &c);
memset (map, '0', sizeof(map));
memset (num, 0, sizeof(num));
getchar();
for(int i = 0; i < r; i++)
gets(map[i]);
int n = 0;
for (int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
if (map[i][j] != '*') {
if(i-1 < 0 || j-1 < 0) num[i][j] = ++n;
else if (map[i-1][j] == '*' || map[i][j-1] == '*') num[i][j] = ++n;
}
if (count != 1) printf("\n");
printf ("puzzle #%d:\nAcross\n", count);
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
if (num[i][j] != 0) {
printf("%3d.", num[i][j]);
while (map[i][j] != '*' && j < c)
printf("%c", map[i][j++]);
printf("\n");
}
printf ("Down\n");
for (int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
if (num[i][j] != 0) {
int t = i;
printf("%3d.", num[i][j]);
while(map[t][j] != '*' && t < r) {
printf ("%c", map[t][j]);
num[t++][j] = 0;
}
printf ("\n");
}
}
return 0;
}