习题3-6 丛横字谜的答案(Crossword Answers,ACM/ICPC World Finals 1994,UVa232)

原题链接:https://vjudge.net/problem/UVA-232
分类:字符串、数组
备注:水题
思路:根据题意做就好了,先遍历数组把每个起始白格编号,再实现每个单词的输出。
代码如下:

#include<stdio.h>
int r, c, kase;
char s[20][20];
inline char read()
{
	char ch = getchar();
	while (ch == ' ' || ch == '\n')ch = getchar();
	return ch;
}
int check(int i, int j)
{
	if (s[i][j] == '*')return 0;
	if (i == 1 || j == 1 || s[i - 1][j] == '*' || s[i][j - 1] == '*')return 1;
	return 0;
}
int main(void)
{
	while (scanf("%d%d", &r, &c) == 2 && r)
	{
		for (int i = 1; i <= r; i++)
			for (int j = 1; j <= c; j++)
				s[i][j] = read();
		int cnt = 0, no[20][20] = { 0 };
		for (int i = 1; i <= r; i++)
			for (int j = 1; j <= c; j++)
				if (check(i, j))cnt++, no[i][j] = cnt;
		if (kase)printf("\n");
		printf("puzzle #%d:\nAcross\n", ++kase);
		for (int i = 1; i <= r; i++)
			for (int j = 1; j <= c; j++)
				if ((j == 1 || s[i][j - 1] == '*') && s[i][j] != '*')
				{
					printf("%3d.", no[i][j]);
					while (j <= c && s[i][j] != '*') printf("%c", s[i][j]), j++;
					printf("\n");
				}
		printf("Down\n");
		for(int i=1;i<=r;i++)
			for(int j=1;j<=c;j++)
				if ((i == 1 || s[i - 1][j] == '*') && s[i][j] != '*')
				{
					printf("%3d.", no[i][j]);
					for (int k = i; k <= r && s[k][j] != '*'; k++)printf("%c", s[k][j]);
					printf("\n");
				}
	}
	return 0;
}
发布了22 篇原创文章 · 获赞 23 · 访问量 509

猜你喜欢

转载自blog.csdn.net/TK_wang_/article/details/104375682