hdoj1242bfs入门

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
int d[210][210];
using namespace std;
const int inf=0x7fffffff;
char field[210][210];
int n,m,sx,sy;
int fx[4]={0,0,-1,1};
int fy[4]={1,-1,0,0};
struct pos
{
    int x,y,step;
};
int bfs()
{
    queue<pos> que;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        d[i][j]=inf;
    d[sx][sy]=0;
    pos tmp,next;
    tmp.x=sx;
    tmp.y=sy;
    tmp.step=0;
    que.push(tmp);
    int minn=inf;
    while(!que.empty())
    {
        tmp=que.front();
        que.pop();
        if(field[tmp.x][tmp.y]=='r')
            minn=min(minn,d[tmp.x][tmp.y]);
        for(int i=0;i<4;i++)
        {
            int nx=tmp.x+fx[i];
            int ny=tmp.y+fy[i];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&field[nx][ny]!='#')
            {
                if(d[nx][ny]>tmp.step+1)
                {
                    next.x=nx;
                    next.y=ny;
                    next.step=tmp.step+1;
                    if(field[nx][ny]=='x')
                        next.step++;
                    que.push(next);
                    d[nx][ny]=next.step;
                }
            }
        }
    }
    return minn;
}
int main()
{
    while(cin>>n>>m)
    {
        memset(d,0,sizeof(d));
        for(int i=0;i<n;i++)
            scanf("%s",field[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(field[i][j]=='a')
                {
                    sx=i;
                    sy=j;
                }
        int res=bfs();
        if(res==inf)
            printf("Poor ANGEL has to stay in the prison all his life.\n");
        else
            printf("%d\n",res);
    }
    return 0;
}

题目大意:一个n*m的监狱,a表示天使,r表示天使的朋友,x表示守卫,.表示路,#表示墙。天使的朋友要去救天使,碰到守卫会增加1s的用时。题意是说有多个朋友,但据说测试数据中都是只有一个朋友的情况。不过我还是按有多个朋友解决。就是从天使作为起点,朋友作为你终点,在所有终点中找最小的那个。



你可能感兴趣的:(hdoj1242bfs入门)