一个简单的广搜问题。题目大意就是:天使的朋友要去救天使,”.”可以走,“#”表示墙不能走,“x”表示士兵,每走一步需要消耗1个能量,杀掉一个士兵要消耗2个能量。问天使的朋友要救天使至少需要多少能量。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
char maze[205][205];
int vis[205][205];
int step[205][205];
int m,n,flag;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
struct node
{
int x,y;
} start,end1;
int bfs()
{
queue<node> q;
q.push(start);
node temp;
vis[start.x][start.y]=1;
while(!q.empty())
{
temp=q.front();
q.pop();
int x1=temp.x;
int y1=temp.y;
for(int i=0; i<4; i++)
{
if(maze[x1+dx[i]][y1+dy[i]]=='.'&&vis[x1+dx[i]][y1+dy[i]]==0&&x1+dx[i]>=0&&x1+dx[i]<m&&y1+dy[i]>=0&&y1+dy[i]<n)
{
temp.x=x1+dx[i];
temp.y=y1+dy[i];
vis[temp.x][temp.y]=1;
q.push(temp);
step[temp.x][temp.y]=step[x1][y1]+1;
continue;
}
if(maze[x1+dx[i]][y1+dy[i]]=='x'&&vis[x1+dx[i]][y1+dy[i]]==0&&x1+dx[i]>=0&&x1+dx[i]<m&&y1+dy[i]>=0&&y1+dy[i]<n)
{
temp.x=x1+dx[i];
temp.y=y1+dy[i];
vis[temp.x][temp.y]=1;
q.push(temp);
step[temp.x][temp.y]=step[x1][y1]+2;
continue;
}
if(maze[x1+dx[i]][y1+dy[i]]=='a'&&vis[x1+dx[i]][y1+dy[i]]==0&&x1+dx[i]>=0&&x1+dx[i]<m&&y1+dy[i]>=0&&y1+dy[i]<n)
{
temp.x=x1+dx[i];
temp.y=y1+dy[i];
vis[temp.x][temp.y]=1;
step[temp.x][temp.y]=step[x1][y1]+1;
flag=1;
return flag;
}
}
}
return flag;
}
int main()
{
while(cin>>m>>n)
{
if(m == 0)
break;
flag=0;
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin>>maze[i][j];
if(maze[i][j] =='a')
{
end1.x=i;
end1.y=j;
}
else if(maze[i][j] =='r')
{
start.x=i;
start.y=j;
}
}
}
if(bfs())
cout<<step[end1.x][end1.y]<<endl;
else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
return 0;
}