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