链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
可能会有多个朋友去救angel。。当一个朋友已经把守卫打死后,另一个朋友就不受该守卫的影响了
所有,从A开始,搜索R比较容易实现....bfs
#include <iostream> #include <queue> #define MAX_N 205 #define INF 1000000 using namespace std; typedef pair<int ,int > P; char maze[MAX_N][MAX_N]; int d[MAX_N][MAX_N]; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; int n,m; int gx,gy; //终点坐标 queue<P> que; void init(void) //初始化 { while(!que.empty()) que.pop(); for(int i=0;i<n;i++) for(int j=0;j<m;j++) d[i][j]=INF; } void findg(void) { for(int i=0; i<n; i++) for(int j=0; j<m; j++) if(maze[i][j]=='a') { gx=i; gy=j; return; } } int bfs(int gx,int gy) //从终点向起点搜索 { que.push(make_pair(gx,gy)); d[gx][gy]=0; while(que.size()) { P p=que.front(); que.pop(); if(maze[p.first][p.second]=='r') //已找到 return d[p.first][p.second]; for(int i=0;i<4;i++) { int nx=p.first+dx[i]; int ny=p.second+dy[i]; if(0<=nx&&nx<n&&0<=ny&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==INF) { que.push(make_pair(nx,ny)); d[nx][ny]=d[p.first][p.second]+1; if(maze[nx][ny]=='x') //如果为守卫, d[nx][ny]+=1; } } } return -1; } int main() { int i; int ans; while(cin>>n>>m) { init(); ans=INF; for(i=0;i<n;i++) cin>>maze[i]; findg(); ans=bfs(gx,gy); if(ans==-1) cout<<"Poor ANGEL has to stay in the prison all his life."<<endl; else cout<<ans<<endl; } return 0; }