//题目:
G-Prison Break
Description
相信大家都看过<>这部经典电影,电影中Michael Scofield是一头陷于绝境欲拼死一搏的怒狮,为了拯救了自己的手足,Michael抢劫了一家银行,因此而被与Lincoln关进同一所监狱-- 福克斯河州立监狱。作为一名建筑工程师,他对监狱的建设蓝图了如指掌,带着Lincoln逃出监狱也成为Michael入狱的唯一目的。Zqlovecs深深的被此所吸引,在一个晚上他在梦中亲身来到了这座监狱,并试图逃离这里。来到这儿他才看清了形式,这座监狱到处都是狱警,而且高高城墙是他肯定无法越过。现在他向你求救,他现在把监狱的地图通过彩信给你,请你帮他计算出最短的逃离时间,并将此路用w(way的缩写)标记出来。人命关天的事情,zqlovecs最相信你了,你千万别让他失望啊。Escaped in x minute(s).
Input
输入有多组测试数据。每一个测试数据第一行有两个整形数据M,N,1<=M<=1000,1<=N=1000 M和 N 分别表示监狱的行数 和 列数 。接下来是监狱的地图,地图中”#”表示城墙,”P”表示狱警察,”.”是安全的路,”X”表示他现在的所处位置(每组测试数据有且只有一个X)。当M, N均 为 0 时,表示输入结束。
Output
对于每组测试数据,如果他能够逃出请在第一列输出最短的逃离时间,格式You can escaped in x minute(s). 然后输出地图,并在地图上将相应的逃生之路用“w“标记出来。假定只有唯一出路,也就是不可能有时间相同的多条逃生路线如果他不能顺利逃脱,那么请输出:My good friend, may God bless you! 每组输出结果之间空一行。
Example Input
5 5
#####
#..X#
#.P.#
#..P#
#.###
4 4
#P##
#..#
#X.#
####
0 0
Example Output
You can escaped in 5 minute(s).
#####
#wwX#
#wP.#
#w.P#
#w###
//代码
#include<stdio.h>
#define N 1001
char map[N][N];
int n,m,work[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int kz[N][N];
struct NODE{
int x;
int y;
}c1[N*N],c2[N*N];
int cn1,cn2;
void find(int row,int col){
int i,j;
if(cn2>=cn1)
return ;
if(row==0 || row==m-1 || col==0 || col==n-1){
if(cn2<cn1){
cn1=cn2;
for(i=1;i<cn1;i++){
c1[i]=c2[i];
}
}
}
for(i=0;i<4;i++){
if(map[row+work[i][0]][col+work[i][1]]=='.' && kz[row+work[i][0]][col+work[i][1]]){
c2[cn2].x=row+work[i][0];
c2[cn2].y=col+work[i][1];
cn2++;
kz[row+work[i][0]][col+work[i][1]]=0;
find(row+work[i][0],col+work[i][1]);
kz[row+work[i][0]][col+work[i][1]]=1;
cn2--;
}
}
}
int main()
{
int i,j,si,sj;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m==0 && n==0)
break;
cn1=1000000,cn2=1;
for(i=0;i<m;i++){
getchar();
for(j=0;j<n;j++){
scanf("%c",&map[i][j]);
kz[i][j]=1;
if(map[i][j]=='X'){
si=i;sj=j;
}
}
}
find(si,sj);
printf("=====================================\n");
if(cn1==1000000){
printf("My good friend, may God bless you!\n");
}
else{
printf("You can escaped in %d minute(s).\n",cn1-1);
for(i=1;i<cn1;i++)
map[c1[i].x][c1[i].y]='w';
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%c",map[i][j]);
}
printf("\n");
}
}
}
return 0;
}