Code:
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
char s[15][15];
int sgd[15][15];//记录是否为起始格
int r,c;
//判断起始格子
bool is_start(int x, int y){
if(s[x][y] == '*') return false;
if(y == 0 || x == 0)
return true;
if(s[x-1][y] == '*' || s[x][y-1] == '*')
return true;
return false;
}
//是否在word内
bool judge(int x, int y){
if(x < 0 || x >= r || y < 0 || y >= c)
return false;
if(s[x][y] == '*')
return false;
return true;
}
int main()
{
int kcase = 0;
while(scanf("%d",&r) == 1){
memset(sgd,0,sizeof(sgd));
if(!r) break;
scanf("%d",&c);
for(int i = 0; i < r; ++i){
scanf("%s",s+i);
}
int cnt = 1;
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
if(is_start(i,j)){
sgd[i][j] = cnt++;
}
}
}
if(++kcase > 1) printf("\n");
printf("puzzle #%d:\n",kcase);
int sx = 0,sy = 0;
bool ok = false;
printf("Across\n");
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
ok = false;
if(sgd[i][j] > 0){
sx = i; sy = j;
ok = true;
printf("%3d.",sgd[i][j]);
}
while(judge(sx,sy)){
putchar(s[sx][sy]);
++sy;
}
if(ok){
i = sx; j = sy;
printf("\n");
}
}
}
sx = sy = 0;
printf("Down\n");
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
ok = false;
if(sgd[i][j] > 0){
sx = i; sy = j;
ok = true;
printf("%3d.",sgd[i][j]);
}
while(judge(sx,sy)){
putchar(s[sx][sy]);
sgd[sx][sy] = 0;//关键 ,防止 重复的情况
++sx;
}
if(ok){
printf("\n");
}
}
}
}
return 0;
}