Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Input First line contains two integers stand for N and M. Output For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life." Sample Input 7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........ Sample Output 13 |
思路:就是简单的深搜,需要注意的就是可能有多个朋友,所以要从a 开始搜,然后更新Min
#include<iostream>
using namespace std;
int vis[205][205];
char m[205][205];
int N,M,x,y,Min;
void dfs(int x,int y,int len){
if(x<0||x>=N||y<0||y>=M) return ;//越界
if(vis[x][y]==1) return ;//已经标记过
if(len>=Min) return ;
if(m[x][y]=='#') return ;
if(m[x][y]=='r'){
if(len<Min)
Min=len;
return ;
}
if(m[x][y]=='x') len++;
vis[x][y]=1;//标记
dfs(x+1,y,len+1);
dfs(x-1,y,len+1);
dfs(x,y+1,len+1);
dfs(x,y-1,len+1);
vis[x][y]=0;//取消标记
}
int main(){
while(scanf("%d%d",&N,&M)!=EOF){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>m[i][j];
if(m[i][j]=='a'){
x=i;
y=j;
}//从a开始
}
getchar();
}
int len=0;
Min=99999;
dfs(x,y,len);
if(Min!=99999)
cout<<Min<<endl;
else
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
return 0;
}