UVa 232 Crosswords Answers

这也算是一道基础题吧,有些人可能会被这么长的一串文字描述给劝退,说实话,刘汝佳紫书里的例题开始会觉得很难,但了解多了算法之后,再回过头来看,也就是题目描述的吓人了一点的入门题。这题要先把每个开头字母给编号,一个字符组存字符,另一个数组存编号就可以解决了。
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
char a[15][15];
int ans[15][15];
int r, c;
void across() {
	for (int i = 1; i <= r; i++) {  //用“行”来循环
		for (int j = 1; j <= c; j++) {
			if ((j == 1 || a[i][j - 1] == '*') && a[i][j] != '*') {  //判断是否要输出
				printf("%3d.", ans[i][j]);
				for (int k = j; k <= c; k++) {    //输出Across
					if (a[i][k] == '*') {
						printf("\n"); break;
					}
					else printf("%c", a[i][k]);
					if (k == c && a[i][k] != '*') printf("\n");
				}
			}
		}
	}
}
void down(){
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			if ((i == 1  || a[i - 1][j] == '*') && a[i][j] != '*') {
				printf("%3d.", ans[i][j]);
				for (int k = i; k <= r; k++) {
					if (a[k][j] == '*') {
						printf("\n"); break;
					}
					else printf("%c", a[k][j]);
					if (k == r && a[k][j] != '*') printf("\n");
				}
			}
		}
	}
}
int main() {
	int puzzle = 1;
	bool flag = false;
	while (scanf_s("%d", &r) && r) {
		if (flag) cout << endl;
		else flag = true;
		int cnt = 1;
		scanf_s("%d", &c);
		memset(ans, 0, sizeof(ans));
		for (int i = 1; i <= r; i++) {
			getchar();
			for (int j = 1; j <= c; j++) {
				a[i][j] = getchar();
				if ((i == 1 || j == 1 || a[i - 1][j] == '*' || a[i][j - 1] == '*') && a[i][j] != '*')
					ans[i][j] = cnt++;
			}
		}
		printf("puzzle #%d:\n", puzzle++);
		cout << "Across" << endl;
		across();
		cout << "Down" << endl;
		down();
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值