Crossword Answers UVA - 232
题目传送:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=168
题目大意:找单词,横着找或者竖着找,格子左边或上边没有东西的或者为‘*’的为起始格,每次找单词都需从起始格开始;
注意还要编号;编号一定要用%3d的形式;
分析:直接判断当前位置的上边或左边是否为空或‘*’,找出所有起始格,然后从起始格开始横向遍历,竖向遍历;
#include<cstdio>
int main()
{
char puzzle[12][12] = {};
int r, c, Case = 0, id[12][12];
while (scanf("%d", &r) && r)
{
scanf("%d", &c);
getchar();
int i, j, count = 1;
//border
for (i = 0; i <= c + 1; i++)
puzzle[r + 1][i] = NULL;//清空
for (i = 0; i <= r + 1; i++)
puzzle[i][c + 1] = NULL;//清空
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
{
puzzle[i][j] = getchar();//存储
if (puzzle[i][j] != '*' && (!puzzle[i - 1][j] || puzzle[i - 1][j] == '*' || !puzzle[i][j - 1] || puzzle[i][j - 1] == '*'))//确定起始格
id[i][j] = count++;//记录编号
}
getchar();//吞掉最后的\n;
}
if (Case)
putchar('\n');//注意这里有一个换行
printf("puzzle #%d:\n", ++Case);
//Across
puts("Across");
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
{
if (puzzle[i][j] != '*' && (puzzle[i][j - 1] == '*' || !puzzle[i][j - 1]))//位置合法就从当前位置遍历输出
{
printf("%3d.", id[i][j]);
for (int k = j; puzzle[i][k] != '*'&&puzzle[i][k]; k++)
putchar(puzzle[i][k]);
putchar('\n');
}
}
}
//Down
puts("Down");
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
{
if (puzzle[i][j] != '*' && (puzzle[i - 1][j] == '*' || !puzzle[i - 1][j]))//同上
{
printf("%3d.", id[i][j]);
for (int k = i; puzzle[k][j] != '*'&&puzzle[k][j]; k++)
putchar(puzzle[k][j]);
putchar('\n');
}
}
}
}
return 0;
}