?纵横字谜的答案 Crossword Answers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
?翻译后大概是:
有一个?r?行?c?列?(1<r,c<10) 的网格,黑格为?*
?,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。
你的任务是先找出网格中所有横向单词(Across
)。这些单词必须从一个起始格(左边是黑格,或是第一列)开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(Down
),规则同上,这些单词必须从一个起始格(上边是黑格,或是第一行)开始,向下延伸到一个黑格的上边或者整个网格的最下行。
?基本实现思路(没有按照题目的规定输入输出,只是一个基本思路):
#include <stdio.h>
#define MAX 100
int main()
{
int lon, wid;
scanf("%d %d", &wid, &lon);
getchar();//吸收掉换行符
char s[MAX][MAX];
for (int i = 0; i < wid; i++)
{
gets_s(s[i], lon + 1);
}
printf("\nAcross:");
for (int i = 0; i < wid; i++)//横向
{
for (int j = 0; j < lon; j++)
{
if (s[i][j] == '*')
;
else
{
if (s[i][j - 1] == '*')
printf("\n%c", s[i][j]);
else
{
printf("%c", s[i][j]);
}
}
}
if (s[i + 1][0] == '*')
;
else
printf("\n");
}
printf("\nDown:");
for (int i = 0; i < lon; i++)//纵向
{
for (int j = 0; j < wid; j++)
{
if (s[j][i] == '*')
;
else
{
if (s[j -1][i] == '*')
printf("\n%c", s[j][i]);
else
{
printf("%c", s[j][i]);
}
}
}
if (s[0][i + 1] == '*')
;
else
printf("\n");
}
return 0;
}
难点在于处理换行问题,上面代码对换行的思路是:
1.判断字母前面是不是*,如果是就进行换行;
2.到下一行时换行;
3.结合1与2的特殊情况,换行后下一行第一个为*,如果不加判断会进行两次换行,所以加判断进行一次换行;(最后一个是*,然后下一行这种情况不用考虑,因为由于1是判断字母前面是不是*才决定换行的,所以最后一个都是*了就不存在这一行还有一个字母了)
4.列与行的思路一样,只是换个反向而已。