• Find a way hdu 2612


    题目链接 :  http://acm.hdu.edu.cn/showproblem.php?pid=2612

    题意:现有两个人约定好要到达KCF,两个人起始位置不一样,KCF不止一家,问你两个人都到达同一家KCF共同花费时间最少的是多少

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    #define maxn 310
    #define oo 0x3f3f3f3f
    using namespace std;
    char maps[maxn][maxn];
    int b[maxn][maxn],v[maxn][maxn];
    int dir[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
    int n, m;
    
    struct note
    {
        int x, y, step;
    };
    
    void BFS(note s)
    {
        queue<note>Q;
        note now, next;
        s.step = 0;
        v[s.x][s.y]=1;
    
        Q.push(s);
    
        while(Q.size())
        {
            now = Q.front();
            Q.pop();
    
            if(maps[now.x][now.y]=='@')
                b[now.x][now.y] += now.step;
    
            for(int i=0; i<4; i++)
            {
                next.x = now.x + dir[i][0];
                next.y = now.y + dir[i][1];
    
                if(next.x>=0 &&next.x<n && next.y>=0 && next.y <m && !v[next.x][next.y] && maps[next.x][next.y]!='#')
                {
                    next.step = now.step+1;
                    v[next.x][next.y] = 1;
                    Q.push(next);
                }
            }
        }
    }
    
    int main()
    {
        int  i, j;
        note s1, s2;
        while(scanf("%d %d",&n, &m)!=EOF)
        {
    
            for(i=0; i<n; i++)
                scanf("%s",maps[i]);
    
            for(i=0; i<n; i++)
                for(j=0; j<m; j++)
                {
                    if(maps[i][j]=='Y')
                    {
                        s1.x=i;
                        s1.y=j;
                    }
                    if(maps[i][j]=='M')
                    {
                        s2.x=i;
                        s2.y=j;
                    }
                }
    
            memset(b,0,sizeof(b));
            memset(v,0,sizeof(v));
            BFS(s1);
            memset(v,0,sizeof(v));
            BFS(s2);
    
            int ans = oo;
    
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    if(b[i][j])
                        ans = min(ans, b[i][j]);
                }
            }
            printf("%d
    ",ans*11);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    把Orchard部署到Windows Azure Web Sites
    使用Windows Live Writer 发布博客园博客
    使用Microsoft Word 2013 发布Blog到博客园
    Java栈的简单实现
    Java中的运算符
    Java简单双向链表实现 @version 1.0
    Java中的面向对象II
    认识和分析日志文件
    两数之和问题
    括号序列算法
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5682313.html
Copyright © 2020-2023  润新知