zoukankan      html  css  js  c++  java
  • 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.
    InputThe 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

    题意:题意大概是在一幅地图上面,一直两个人的位置,求这两个人到KFC的最小距离之和,最后乘以11得到所用最小时间和
    (KFC用‘@’表示,墙用‘#’表示,两个人分别为M和Y,‘.’表示能通过)

    分析:分别求用bfs求两个人到KFC的最短距离,(我将maxi设置成的40050,因为m<=200,n>=2,我用的40050AC了),将每一条
    KFC的距离进行比较得出最短距离
    AC代码:
    #include<iostream>
    #include<queue>
    #include<string.h>
    #include<string>
    using namespace std;
    struct knot
    {
        int x,y;     //结点的横纵坐标
        int t;       //到达当前结点所走的步数
    };
    knot ai,temp;
    
    
    int s1[205][205];    //判断所在结点是否为遍历过
    int n,m;             //地图大小
    int s2[2][205][205];
    int flag[4][2]={1,0,-1,0,0,1,0,-1};    //用于移动的方向
    char a[205][205];
    int mini(int a,int b)
    {
        return a>b?b:a;
    }
    void bfs(int ix,int iy,int ik)   //广度优先查找
    {
        queue<knot>s;      //建立一个装knot的队列
        temp.x=ix;         //temp作为中间变量,即主函数中需要查找的点
        temp.y=iy;
        temp.t=0;          //移动步数初始化为0;
        s.push(temp);
        while (!s.empty())
        {
            ai=s.front();
            s.pop();
            temp.t=ai.t+1;        //移动步数加1
            for (int i=0;i<4;i++)
            {
                temp.x=ai.x+flag[i][0];        //移动x坐标
                temp.y=ai.y+flag[i][1];        //移动y坐标
                if (temp.x>=0&&temp.x<n&&temp.y>=0&&temp.y<m&&s1[temp.x][temp.y]==0&&a[temp.x][temp.y]!='#')    
    
                   //判断还能不能朝着同一个方向继续前行
                {
                    if (a[temp.x][temp.y]=='@')
                     s2[ik][temp.x][temp.y]=temp.t;
                     s1[temp.x][temp.y]=1;
                     s.push(temp);
                }
            }
    
    
        }
    }
    int main()
    {
    
    
         int xm,ym,xy,yy;
    
    
         while (cin>>n>>m)
         {
    
    
             for (int i=0;i<n;i++)
             {
                 for (int j=0;j<m;j++)
                  {  cin>>a[i][j];
                      if (a[i][j]=='M')       //确定M所在位置的坐标
                     xm=i,ym=j;
                      if (a[i][j]=='Y')    //确定Y所在位置的坐标
                    xy=i,yy=j;
                 }
    
    
             }
             int maxi=1000000;   //注意maxi初始化的位置,在输入一组地图以后maxi会发生改变
           memset(s1,0,sizeof(s1));
           memset(s2,0,sizeof(s2));
             s1[xm][ym]=1;
             bfs(xm,ym,1);
            memset(s1,0,sizeof(s1));  
    
        //在第一次进行bfs时,s1数据发生改变,因此在第二次bfs前需要清零;memset的头文件为#include<cstring>
             s1[xy][yy]=1;
             bfs(xy,yy,2);
             for (int i=0;i<n;i++)
                 for (int j=0;j<m;j++)
                    if (s2[1][i][j]&&s2[2][i][j])
                        maxi=mini(maxi,s2[1][i][j]+s2[2][i][j]);   //求最小距离
             cout << maxi*11 << endl;     //每一步需要11分钟
         }
        return 0;
    }
    
    
    
     
  • 相关阅读:
    什么是大小端
    mina
    出现jar包找不到的问题解决方案
    InnoDB 静态数据加密的常见问题合集
    mysqldump 数据库备份程序,mysqldump 选项合集
    出现The MySQL server is running with the --secure-file-priv option so it cannot问题的原因
    小睡一会,做了一个梦
    IntelliJ IDEA is a solution that appears after importing a project with a clock icon(idea导入项目之后出现时钟的解决方案)
    IntelliJIDE不显示项目文件夹的问题
    夏天的记忆
  • 原文地址:https://www.cnblogs.com/lisijie/p/7229120.html
Copyright © 2011-2022 走看看