题解:
题目难就难在读懂题意(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;
}