码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2612 水BFS

时间:2015-03-09 20:58:41      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

两个人(Y和M)要在‘@’处相遇,图中有不定个‘@’;

对每个人做一遍BFS即可,然后枚举每个‘@’位置


#include "stdio.h"
#include "string.h"
#include "queue"
using namespace std;
const int inf=0x7fffffff;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
    int x,y,t;
};

int y_n,y_m,m_n,m_m,n,m;
char str[210][210];
int sum[210][210],mark[210][210];

int Min(int a,int b)
{
    if (a<b) return a;else return b;
}

int judge(int x,int y)
{
    if (x<0 || y<0 || x>=n || y>=m) return 0;
    if (mark[x][y]==1) return 0;
    if (str[x][y]=='#') return 0;
    return 1;
}

void bfs()
{
    queue<node>q,qq;
    node cur,next;
    int i;
    cur.x=y_n;
    cur.y=y_m;
    cur.t=0;
    memset(mark,0,sizeof(mark));
    mark[y_n][y_m]=1;
    sum[cur.x][cur.y]=0;
    q.push(cur);
    while (!q.empty())
    {
        cur=q.front();
        q.pop();
        for (i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if (judge(next.x,next.y)==0) continue;
            next.t=cur.t+1;
            mark[next.x][next.y]=1;
            sum[next.x][next.y]=next.t;
            q.push(next);
        }
    }

    cur.x=m_n;
    cur.y=m_m;
    cur.t=0;
    memset(mark,0,sizeof(mark));
    mark[m_n][m_m]=1;
    qq.push(cur);
    while(!qq.empty())
    {
        cur=qq.front();
        qq.pop();
        for (i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if (judge(next.x,next.y)==0) continue;
            next.t=cur.t+1;
            mark[next.x][next.y]=1;
            sum[next.x][next.y]+=next.t;
            qq.push(next);
        }
    }
}
int main()
{
    int i,j,ans;
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        for (i=0;i<n;i++)
            scanf("%s",str[i]);
        for (i=0;i<n;i++)
            for (j=0;j<m;j++)
            if (str[i][j]=='Y')
            {
                y_n=i;
                y_m=j;
            }
            else
            if (str[i][j]=='M')
            {
                m_n=i;
                m_m=j;
            }
        memset(sum,-1,sizeof(sum));

        bfs();
        ans=inf;
        for (i=0;i<n;i++)
            for (j=0;j<m;j++)
            if (str[i][j]=='@' && sum[i][j]!=-1)
                ans=Min(ans,sum[i][j]);


        printf("%d\n",ans*11);
    }
    return 0;
}


HDU 2612 水BFS

标签:

原文地址:http://blog.csdn.net/u011932355/article/details/44159137

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!