HDU 2612 BFS*2

*2 就是2次了;呵呵

题目很坑爹,描述模糊不清.

注意几点:

*1.Y点M点相当于墙,不能穿过(虽然不符合常理);

*2.@可以穿过

另外,题目其实说是求距离和最短还差不多,时间最短不合理了,每人都需要3分钟到那儿,一共需要多少分钟,还是3分钟.但是他叠加了;

这到是题外话;

代码:

/*
 *HDU 2612
 *fuqiang11
 *BFS
 *2013/7/31
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define maxn 200+3
#define INF 0x3f3f3f3f
using namespace std;

int n,m;
char maze[maxn][maxn];
bool vis[maxn][maxn];
int dis[maxn][maxn];
int xx[] = {0,0,1,-1};
int yy[] = {1,-1,0,0};
struct point
{
    int x;
    int y;
    int d;
};
point YF,MER,KFC[maxn*maxn];  //YuFeiFei 和 Merceki 位置 以及 kfc 店位置
int Nkfc;//统计KFC店数量

bool check(int x, int y)
{
    if(x<1||y<1||x>n||y>m||maze[x][y]=='#'||vis[x][y])
        return false;
    return true;
}

queue <point> q;
void BFS(point st)
{
    memset(vis,false,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    while(!q.empty())
        q.pop();
    st.d = 0;
    q.push(st);
    vis[st.x][st.y] = true;
    dis[st.x][st.y] = 0;
    point a,b;
    while(!q.empty())
    {
        a = q.front();
        q.pop();
        for(int i = 0; i < 4; i++)
        {
            b.x = a.x + xx[i];
            b.y = a.y + yy[i];
            b.d = a.d + 1;
            if(check(b.x, b.y))
            {
                q.push(b);
                vis[b.x][b.y] = true;
                dis[b.x][b.y] = b.d;
            }
        }
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
#endif
    while(cin>>n>>m)
    {
        Nkfc = 0;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                cin>>maze[i][j];
                if(maze[i][j] == '@')
                {
                    KFC[Nkfc].x = i;
                    KFC[Nkfc].y = j;
                    Nkfc++;
                    maze[i][j] = '.';
                }
                else if(maze[i][j] == 'Y')
                {
                    YF.x = i;
                    YF.y = j;
                    maze[i][j] = '#';
                }
                else if(maze[i][j] == 'M')
                {
                    MER.x = i;
                    MER.y = j;
                    maze[i][j] = '#';
                }
            }
        }
        BFS(YF);
        for(int i = 0; i < Nkfc; i++)
        {
            KFC[i].d = dis[KFC[i].x][KFC[i].y];
//            cout<<KFC[i].d<<" ";
        }
        BFS(MER);
        int MIN_D = INF;
        for(int i = 0; i < Nkfc; i++)
        {
            if(KFC[i].d + dis[KFC[i].x][KFC[i].y] < MIN_D)
            {
                MIN_D = KFC[i].d + dis[KFC[i].x][KFC[i].y];
            }
        }
        cout<<MIN_D*11<<endl;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值