坑点:
1。输出按顺序来,Across时正常,Down时要把所访问过得num置0
2。非第一例要空一行
下面上代码
#include<cstdio>
#include<cstring>
#define MAXN 12
char pic[MAXN][MAXN];
int num[MAXN][MAXN];
int r, c;
int cnt;
bool isNoBlank(int x, int y){
if(x == 0 || y == 0)
return true;
else if(pic[x - 1][y] == '*' || pic[x][y - 1] == '*')
return true;
return false;
}
void solve(){
cnt = 0;
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
if(pic[i][j] != '*'){
if(isNoBlank(i, j)){
num[i][j] = ++cnt;
}else{
num[i][j] = 0;
}
}
}
}
printf("Across\n");
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
if(num[i][j] != 0){
printf("%3d.%c", num[i][j], pic[i][j]);
while(++j < c && pic[i][j] != '*'){
printf("%c", pic[i][j]);
}
printf("\n");
}
}
}
printf("Down\n");
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
if(num[i][j] != 0){
printf("%3d.%c", num[i][j], pic[i][j]);
num[i][j] = 0;
int k = i + 1;
while(k < r && pic[k][j] != '*'){
printf("%c", pic[k][j]);
num[k][j] = 0;
k++;
}
printf("\n");
}
}
}
}
int main(){
int T = 0;
while(scanf("%d", &r) == 1 && r){
scanf("%d", &c);
memset(num, 0, sizeof(num));
for(int i = 0 ; i < r; ++i){
scanf("%s", pic[i]);
}
if(T++) printf("\n");
printf("puzzle #%d:\n", T);
solve();
}
return 0;
}