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