紫书——Crossword Answers UVA - 232

题解:

题目难就难在读懂题意(orz好吧,英文不好)

这道题目要求是开始格(有数字那些)就先横向输出,然后纵向输出,并且输出之后,后面被输出过的开始格就不会在输出一次,这就要求我们要对输出过的字母作保存。

其二,纵向输出的时候,还是从1-n开始格的顺序,这个要小心,容易被绕晕

然后贴上代码,函数1为横向输出,0为纵向输出

#include <bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f

int r,c;
string str[15];
int num[15][15];	//记录开头数字
int isp[15][15];	//记录是否被打印过

void print_c(int n, int rc) {	//打印第n列的,注意打印方式还是行打印
	for(int i = 0; i < c; i++) {
		if(num[n][i] && !isp[n][i]) {
			printf("  %d.",num[n][i]);
			if(rc) {
				for(int j = i; j < c; j++) {
					if(str[n][j] == '*') break;
					isp[n][j] = 1;
					printf("%c",str[n][j]);
				}
			} else {
				for(int j = n; j < r; j++) {
					if(str[j][i] == '*') break;
					isp[j][i] = 1;
					printf("%c",str[j][i]);
				}
			}
			printf("\n");
		}
	}
}

int main() {
	//freopen("in.txt","r",stdin);

	int rnd = 0;
	while(scanf("%d%d",&r,&c) == 2 && r) {
		memset(num,0,sizeof(num));
		int n = 1;
		for(int i = 0; i < r; i++) {
			cin >> str[i];
			for(int j = 0; j < c; j++) {
				if((j==0 || i == 0 || str[i][j-1] == '*' || str[i-1][j] == '*') && (str[i][j] != '*')) {
					num[i][j] = n++;
				}
			}
		}
		if(rnd) printf("\n");
		printf("puzzle #%d:\n",++rnd);
		printf("Across\n");
		memset(isp,0,sizeof(isp));
		for(int i = 0; i < r; i++)	print_c(i,1);
		printf("Down\n");
		memset(isp,0,sizeof(isp));
		for(int i = 0; i < r; i++)	print_c(i,0);
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80188107