BFS 广搜

HDU 2612

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;

#define INF 0x3f3f3f3f
#define N 210

int n, m;
char maps[N][N];
int vis[N][N], dis[N][N][2], f;
int dir[4][2]={{1,0}, {0,1}, {-1,0}, {0,-1}};

struct node
{
    int x, y, step;
};

queue <node> q;

void BFS(int x, int y)
{
    node head, next;
    head.x=x;
    head.y=y;
    head.step=0;
    vis[x][y]=1;
    q.push(head);

    while(!q.empty())
    {
        head=q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            next.x=head.x+dir[i][0];
            next.y=head.y+dir[i][1];
            if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&!vis[next.x][next.y]
               &&(maps[next.x][next.y]=='.'||maps[next.x][next.y]=='@'))
            {
                vis[next.x][next.y]=1;
                next.step=head.step+1;
                if(maps[next.x][next.y]=='@')
                    dis[next.x][next.y][f]=min(dis[next.x][next.y][f], next.step);
                q.push(next);
            }
        }
    }
}

int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        memset(dis, INF, sizeof(dis));
        for(int i=0; i<n; i++)
            scanf("%s", maps[i]);

        for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            if(maps[i][j]=='Y')
            {
                f=0;
                memset(vis, 0, sizeof(vis));
                BFS(i, j);
            }
            else if(maps[i][j]=='M')
            {
                f=1;
                memset(vis, 0, sizeof(vis));
                BFS(i, j);
            }
        }

        int ans=INF;

        for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            if(maps[i][j]=='@'&&ans>dis[i][j][0]+dis[i][j][1])
                ans=dis[i][j][0]+dis[i][j][1];
        }
        printf("%d\n", ans*11);
    }
}

 

posted on 2016-05-28 17:07  南风丶丶  阅读(146)  评论(0编辑  收藏  举报