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
[email protected]
.#...
.#...
@..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;
}

				
时间: 2024-10-27 13:18:16

Find a way (广度优先搜索)的相关文章

无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存. 带不带权都无所谓的 深度优先搜索 Depth First Search 道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问. 由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了 1 //深度优先 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) { 3 int *visited = new int[VertexNumber];

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

矩阵图中的广度优先搜索

经常会有类似的题目,如迷宫问题,在一个矩阵图中给定出发点和目标点,每次只能上下左右移动,求到目标点的最短走法,或者说是一共有多少种走法. 思路其实很简单,深搜.广搜.相对比较而言,广度优先搜索更加实用于求最短的走法(步数) 在矩阵图中的广搜需要注意一下几点. 1.确定每步的走法:不同题的走法可能不同,每次搜索时将走法保存在数组中. 2.确定初始状态 往往注意刚开始得起点(i,j)必须把MAP(i,j)改变为 -1(或者其他的),栈中第一个元素即为初始状态 3.保存状态.这点很重要.需要用数组或者

地牢逃脱(BFS(广度优先搜索))

题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上.地牢的出口可能在任意某个可以通行的位置上.牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示

图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_VERTEX_NUM 20 4 #define MAXQSIZE 100 5 #define OK 1 6 typedef char VertexType; 7 typedef int QElemType; 8 9 typedef struct ArcNode//边结点 10 { 11 int adjvex; 12 str

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然