链接: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;
}