/*
题意:输入一个r行c列的网格,黑格用*号表示,每个白格都填有一个字母。
如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界)
则称这个白格是一个起始格。首先把所有起始格从左到右
从上到下顺序编号1,2,3,。。。。要求找出所有横向单词。这些单词必须从一个起始格开始,
向右延伸到一个黑格的左边或者整个网格的最右边。最后找出所有的竖向单词。
*/
int main()
{
int cse = 1;
while (1)
{
int r = -1, c = -1, cnt = 1;
char grid[10][11];
int cntpos[10][11];
memset(cntpos, 0, sizeof(cntpos));
scanf("%d", &r);
if (r == 0)
break;
scanf("%d", &c);
for (int i = 0; i < r; i++)
scanf("%s", &grid[i]);
for (int j = 0; j < c; j++)
{
if (cntpos[0][j] == 0 && grid[0][j] != '*')
cntpos[0][j] = cnt++;
}
for (int i = 1; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (j == 0 && grid[i][j] != '*')
cntpos[i][j] = cnt++;
else if (grid[i - 1][j] == '*'&&grid[i][j] != '*')
cntpos[i][j] = cnt++;
else if (grid[i][j - 1] == '*'&&grid[i][j] != '*')
cntpos[i][j] = cnt++;
}
}
if (cse != 1)
printf("\n");
printf("puzzle #%d:\n", cse++);
printf("Across\n");
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (grid[i][j] != '*')
{
printf("%3d.", cntpos[i][j]);
for (; grid[i][j] != '*'&&j < c; j++)
{
printf("%c", grid[i][j]);
}
printf("\n");
}
}
}
printf("Down\n");
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if ((i == 0 || grid[i - 1][j] == '*') && grid[i][j] != '*')
{
printf("%3d.", cntpos[i][j]);
for (int k = i; k < r; k++)
{
if (grid[k][j] == '*')
break;
printf("%c", grid[k][j]);
}
printf("\n");
}
}
}
}
return 0;
}```
P58 3-6纵横字谜的答案
最新推荐文章于 2022-10-17 15:08:46 发布