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[][]; //判断所在结点是否为遍历过
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 (广度优先搜索)的更多相关文章
- 图的广度优先搜索(BFS)
把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...
- ACM题目————图的广度优先搜索
题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...
- SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- 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 ...
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜 ...
- 广度优先搜索BFS
广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理: ...
随机推荐
- 第二季 第十一天 part2
const greeting = function() { // 注意,这个 this.name 取决于谁调用了 greeting() 函数 console.log('Hi, ', this.name ...
- arg min,arg max, e.g ,i.e
数学中常见的arg min,arg max 是什么意思 arg 是变元(即自变量argument)的英文缩写 arg min 就是使后面这个式子到达最小值时的变量的取值 arg max 就是使后面这个 ...
- 吴裕雄--天生自然 PYTHON3开发学习:CGI编程
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny ...
- android studio 3.2 bundle.gradle 与2.2区别
参考:https://blog.csdn.net/MakerCloud/article/details/82898305
- Opencv笔记(八)——图像上的算数运算
学习目标: 学习图像上的算术运算,加法,减法,位运算等. 学习函数cv2.add(),cv2.addWeighted() 等. 一.图像的加法 你可以使用函数 cv2.add() 将两幅图像进行加法运 ...
- C++ 传参的方式 值传递,指针传递,引用传递
关于传参总是搞晕,这里总结下: 值传递: void func(int n) { } void main() { int x = 1; func(x); return; } 这种就是值传递,在func函 ...
- php先响应后处理
php响应异步请求或者返回时效要求高的接口中,可以先响应输出,再执行逻辑处理保存数据等任务 ob_end_clean(); ob_start(); echo '{"data":&q ...
- python_8_集合
1.集合:可变集合set,不可变集合frozenset,集合是无序不重复的 set('hello') set9[1,2,3,4]) set((1,2,3)) 2.添加元素 > add:将元素整体 ...
- poj 2342树形dp板子题1
http://poj.org/problem?id=2342 #include<iostream> #include<cstdio> #include<cstring&g ...
- day03-函数
形参:位置参数:必须传 *args:动态参数,可以接收任意多个位置参数 默认值参数:可以传也可以不传 **kwargs:动态参数,可以接收多个关键字参数. 实参:按照位置传参,按照关键字传参. #顺序 ...