最短路(纯搜索) (2011-3-19 09:48)

//题目:

G-Prison Break

Description

相信大家都看过<>这部经典电影,电影中Michael Scofield是一头陷于绝境欲拼死一搏的怒狮,为了拯救了自己的手足,Michael抢劫了一家银行,因此而被与Lincoln关进同一所监狱-- 福克斯河州立监狱。作为一名建筑工程师,他对监狱的建设蓝图了如指掌,带着Lincoln逃出监狱也成为Michael入狱的唯一目的。Zqlovecs深深的被此所吸引,在一个晚上他在梦中亲身来到了这座监狱,并试图逃离这里。来到这儿他才看清了形式,这座监狱到处都是狱警,而且高高城墙是他肯定无法越过。现在他向你求救,他现在把监狱的地图通过彩信给你,请你帮他计算出最短的逃离时间,并将此路用wway的缩写)标记出来。人命关天的事情,zqlovecs最相信你了,你千万别让他失望啊。Escaped in x minute(s). 

Input

输入有多组测试数据。每一个测试数据第一行有两个整形数据M,N,1<=M<=1000,1<=N=1000 M分别表示监狱的行数 和 列数 。接下来是监狱的地图,地图中”#”表示城墙,”P”表示狱警察,”.”是安全的路,”X”表示他现在的所处位置(每组测试数据有且只有一个X)。当M N均 为时,表示输入结束。 

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值