zoukankan      html  css  js  c++  java
  • Find a way——L

                                                 

                                             L. Find a way

               

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
    Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest. 
    Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
     

    Input

    The input contains multiple test cases.
    Each test case include, first two integers n, m. (2<=n,m<=200). 
    Next n lines, each line included m character.
    ‘Y’ express yifenfei initial position.
    ‘M’    express Merceki initial position.
    ‘#’ forbid road;
    ‘.’ Road.
    ‘@’ KCF
     

    Output

    For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
     

    Sample Input

    4 4
    Y.#@
    ....
    .#..
    @..M
    4 4
    Y.#@
    ....
    .#..
    @#.M
    5 5
    Y..@.
    .#...
    .#...
    @..M.
    #...#

    Sample Output

    66
    88
    66
    题意:
       Y和M要在KFC见面,地图上有多个KFC,求在哪个KFC两人所走总距离最短,(注意KFC可以当做路)。
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    #define N 210
    #define inf 0xffffff
    using namespace std;
    int n,m,flag;
    int dir[4][2]={1,0,0,1,-1,0,0,-1};
    char s[N][N];
    int mark[N][N],dis[N][N][2];
    struct node
    {
        int x,y,step;
    };
    bool judge(int x,int y)
    {
       if(x>=0 && x<m && y>=0 && y<n && s[x][y]!='#' && mark[x][y]==0)
           return 1;
       return 0;
    }
    void bfs(int x,int y)
    {
        queue<node>q;
        node cur,next;
        cur.x=x;cur.y=y;cur.step=0;
        mark[x][y]=1;
        q.push(cur);
        while(!q.empty())
        {
        cur=q.front();
        q.pop();
        next.step=cur.step+1;
            for(int k=0;k<4;k++)
           {
            next.x=x=cur.x+dir[k][0];
            next.y=y=cur.y+dir[k][1];
            if(judge(x,y))
            {
                mark[x][y]=1;
                 if(s[x][y]=='@')
                    dis[x][y][flag]=next.step;
                q.push(next);
            }
    
             }
        }
    
    }
    int main()
    {
        int i,j,min;
        while(scanf("%d%d",&m,&n)!=EOF&&n&&m)
        {
            min=inf;
             for(i=0;i<m;i++)
               for(j=0;j<n;j++)
                   dis[i][j][0]=dis[i][j][1]=inf;
            for( i=0;i<m;i++)
              scanf("%s",s[i]);
            for(i=0;i<m;i++)
                for( j=0;j<n;j++)
                {
                 if(s[i][j]=='Y')
                 {
                    flag=0;
                    memset(mark,0,sizeof(mark));
                    bfs(i,j);
                 }
                 else if(s[i][j]=='M')
                      {
                      flag=1;
                      memset(mark,0,sizeof(mark));
                      bfs(i,j);
                       }
                 }
             for(i=0;i<m;i++)
               for(j=0;j<n;j++)
                   if(s[i][j]=='@' && min>dis[i][j][0]+dis[i][j][1])
                       min=dis[i][j][0]+dis[i][j][1];
              printf("%d
    ",min*11);
        }
        return 0;
    }
     

  • 相关阅读:
    什么是系统打开文件表?
    为什么Unix只允许对非目录文件实行勾链?
    在Unix系统中,主存索引节点和辅存索引节点从内容上比较有什么不同,为什么要设置主存索引节点?
    Unix系统的文件目录项的内容是什么,这样处理的好处是什么?
    Unix系统使用的地址索引结构有什么特点?
    Unix文件系统的主要特点是什么?
    什么是打开文件操作,什么关闭文件操作,引入这两个操作的目的是什么?
    在非洲运营互联网系统-基础建设
    这一年在非洲(4年一轮回总结完结)
    4年一轮回(后半部)
  • 原文地址:https://www.cnblogs.com/fenhong/p/5264575.html
Copyright © 2011-2022 走看看