题目:

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[][]; //判断所在结点是否为遍历过
int n,m; //地图大小
int s2[][][];
int flag[][]={,,-,,,,,-}; //用于移动的方向
char a[][];
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;
s.push(temp);
while (!s.empty())
{
ai=s.front();
s.pop();
temp.t=ai.t+; //移动步数加1
for (int i=;i<;i++)
{
temp.x=ai.x+flag[i][]; //移动x坐标
temp.y=ai.y+flag[i][]; //移动y坐标
if (temp.x>=&&temp.x<n&&temp.y>=&&temp.y<m&&s1[temp.x][temp.y]==&&a[temp.x][temp.y]!='#') //判断还能不能朝着同一个方向继续前行
{
if (a[temp.x][temp.y]=='@')
s2[ik][temp.x][temp.y]=temp.t;
s1[temp.x][temp.y]=;
s.push(temp);
}
} }
}
int main()
{ int xm,ym,xy,yy; while (cin>>n>>m)
{ for (int i=;i<n;i++)
{
for (int j=;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=; //注意maxi初始化的位置,在输入一组地图以后maxi会发生改变
memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
s1[xm][ym]=;
bfs(xm,ym,);
memset(s1,,sizeof(s1)); //在第一次进行bfs时,s1数据发生改变,因此在第二次bfs前需要清零;memset的头文件为#include<cstring>
s1[xy][yy]=;
bfs(xy,yy,);
for (int i=;i<n;i++)
for (int j=;j<m;j++)
if (s2[][i][j]&&s2[][i][j])
maxi=mini(maxi,s2[][i][j]+s2[][i][j]); //求最小距离
cout << maxi* << endl; //每一步需要11分钟
}
return ;
}

 

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

  1. 图的广度优先搜索(BFS)

    把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...

  2. 广度优先搜索(BFS)

    定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...

  3. 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

    广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...

  4. ACM题目————图的广度优先搜索

    题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...

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

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  6. HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  7. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. HDU 1242 Rescue (BFS(广度优先搜索))

    Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

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

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜 ...

  10. 广度优先搜索BFS

    广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理: ...

随机推荐

  1. Maven--排除依赖

    传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理,但是有些时候这种特性也会带来问题. 例如,当前项目有一个第三方依赖,而这个第三方的依赖由于某些原因依赖了另外一个类库的 SNAPSH ...

  2. 浅谈那些你不知道的C艹语法

    C艹实践中的超神语法 pragma 卡常必备QAQ #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(" ...

  3. 处理Ajax请求跨域问题

    ajax跨域的原理 ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resourc ...

  4. 【转】修改Ubuntu系统的登陆信息的简单方法

    转自http://www.jb51.net/os/Ubuntu/414663.html Ubuntu的登陆和欢迎信息控制/etc/issue和/etc/motd/etc/issue与/etc/motd ...

  5. python处理nii格式文件

    网上已经有很多代码了,但是注释的都不全,看起来很费解,我自己加了一些注释,重新发出来,尽可能的通俗易懂 读取前需要先安装库 pip install nibabel pip install matplo ...

  6. Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解决

    eclipse中遇到了Syntax error on token "Invalid Character", delete this token(令牌“无效字符”上的语法错误,删除此 ...

  7. 六、linux-mysql的mysql字符集问题

    一.什么是字符集? 字符集是用来定义mysql数据字符串的存储方式,而校对规则则是定义比较字符串的方式.mysql字符集包含字符集和校对规则. 二.字符集的选择 常见的字符集中,中英混合环境建议用UT ...

  8. day41-进程-管道

    #1.管道Pipe:双向通信: from multiprocessing import Pipe p1,p2 = Pipe() p1.send('hello') print(p2.recv()) p2 ...

  9. AJAX数据传输

    AJAX = Asynchronous JavaScript and XML(异步的Javascript和XML) AJAX最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页 ...

  10. VSTO作品:OutlookMailViewer的下载和使用

    OutlookMailViewer用于Outlook 2013/2016的一款插件. 电脑的安装环境要求:具有VSTO运行环境+Net Framework 4.0以上. 下载地址: OutlookMa ...