纵横字谜的答案 Crossword Answers

纵横字谜的答案 Crossword Answers_第1张图片

 纵横字谜的答案 Crossword Answers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 翻译后大概是:

有一个 r 行 c 列 (1* ,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。

你的任务是先找出网格中所有横向单词(Across)。这些单词必须从一个起始格(左边是黑格,或是第一列)开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(Down),规则同上,这些单词必须从一个起始格(上边是黑格,或是第一行)开始,向下延伸到一个黑格的上边或者整个网格的最下行。

 基本实现思路(没有按照题目的规定输入输出,只是一个基本思路):

#include 
#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.列与行的思路一样,只是换个反向而已。

你可能感兴趣的:(c语言,算法,c++)