Find a way——BFS

【题目描述】
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

【题目分析】
进过分析就是一个很简单的BFS,只不过需要对两个人分别进行BFS然后再依次对每个KFC判断,取步数和最少的。
需要注意的是如果初始化的时候步数为0,那么某个KFC的步数为0说明有一个人无法到达这个地方,需要判断,否则会错
【AC代码】

#include<cstdio>
#include<cstring>
#include<queue>
#include<climits>
using namespace std;const int drc[4][2]={{1,0},{-1,0},{0,1,},{0,-1}};
const int MAXN=205;
char map[MAXN][MAXN];
bool vis[MAXN][MAXN];
int a1[MAXN][MAXN];
int a2[MAXN][MAXN];
int n,m,ans;
int x1,x2,y1,y2;struct node
{int x,y;int step;
}t,p;
int cnt=0;void BFS1()
{int u,v;queue<node> q;p.x=x1; p.y=y1; p.step=0;memset(vis,0,sizeof(vis));memset(a1,0,sizeof(a1));vis[x1][y1]=1;q.push(p);while(!q.empty()){p=q.front(); q.pop();if(map[p.x][p.y]=='@'){a1[p.x][p.y]=p.step;}for(int i=0;i<4;i++){u=p.x+drc[i][0]; v=p.y+drc[i][1];if(u<0 || u>=n || v<0 || v>=m) continue;if(map[u][v]=='#' || vis[u][v]) continue;vis[u][v]=1;t.x=u; t.y=v; t.step=p.step+1;q.push(t);}}
}void BFS2()
{int u,v;queue<node> q;p.x=x2; p.y=y2; p.step=0;memset(vis,0,sizeof(vis));memset(a2,0,sizeof(a1));vis[x2][y2]=1;q.push(p);while(!q.empty()){p=q.front(); q.pop();if(map[p.x][p.y]=='@'){a2[p.x][p.y]=p.step;}for(int i=0;i<4;i++){u=p.x+drc[i][0]; v=p.y+drc[i][1];if(u<0 || u>=n || v<0 || v>=m) continue;if(map[u][v]=='#' || vis[u][v]) continue;vis[u][v]=1;t.x=u; t.y=v; t.step=p.step+1;q.push(t);}}
}int main()
{while(~scanf("%d%d",&n,&m)){memset(map,0,sizeof(map));for(int i=0;i<n;i++){scanf("%s",map[i]);for(int j=0;j<m;j++){if(map[i][j]=='Y'){x1=i; y1=j; map[i][j]='.';continue;}if(map[i][j]=='M'){x2=i; y2=j; map[i][j]='.';continue;}}}BFS1();BFS2();ans=INT_MAX;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(map[i][j]=='@' && a1[i][j]!=0 && a2[i][j]!=0)	//很重要{ans=min(ans,a1[i][j]+a2[i][j]);}}}printf("%d\n",ans*11);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用C语言操作MySQL数据库

http://blog.chinaunix.net/uid-26743670-id-3479887.html 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数&#xff0c;并在下一节详细介绍了它们。请参见25.2.3节&#xff0c;“C API函数描述”。 函数 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查…

三字棋

整个游戏可以分为以下几个环节 1.打印一个玩游戏的菜单 2.玩游戏 (1)玩家走一步 (2)电脑走一步 每走一步对结果进行显示,其中游戏的结果可分为玩家赢,电脑赢,以及平局 代码显示如下 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdlib.h> #include<stdio.h&…

gets fgets 区别

http://www.cnblogs.com/aexin/p/3908003.html 1. gets与fgets gets函数原型&#xff1a;char*gets(char*buffer);//读取字符到数组&#xff1a;gets(str);str为数组名。 gets函数功能&#xff1a;从键盘上输入字符&#xff0c;直至接受到换行符或EOF时停止&#xff0c;并将读取…

Fliptile——搜索+二进制优化

【题目描述】 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is col…

扫雷

1.将扫雷界面看成一个二维数组,先对界面进行打印 2.置雷 3.排雷 4.对每次的结果进行游戏输出 5.提醒用户游戏输赢 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //初始化 void init_board(char mine[ROWS][COLS], int rows, int cols, char set) {in…

C相关练习题

1.调整数组使奇数全部都位于偶数前面。 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 #include<stdio.h> void range(int arr[], int sz) {int left…

【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)

http://blog.csdn.net/hanjing_1995/article/details/51539563 [cpp] view plaincopy #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; //单链表的实现 #include<assert.h> typedef int DataType; typedef…

Shuffle'm Up——简单模拟

【题目描述】 A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several diff…

C++ explicit关键字详解

http://www.cnblogs.com/ymy124/p/3632634.html 首先, C中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声…

Fire!——两个BFS

【题目描述】 【题目分析】 看到题目后很清楚是两个BFS&#xff0c;可是我觉得对于火的BFS可以转换成判断&#xff0c;我的做法是将火的位置全部记录下来&#xff0c;然后判断某个位置距离每个火的步数是否小于当前步数&#xff0c;可是错了&#xff0c;还不清楚为什么&#x…

函数调用过程(栈桢)

栈桢 首先来看一段代码 #include<stdio.h> int add(int x, int y) {int z x y;return z; } int main() {int a 10;int b 20;int ret add(a, b);printf("ret %d\n",ret);return 0; } 此处是为了给a,b分别开辟空间,这时栈桢如图所示 两条push命令将a,b变…

C++智能指针简单剖析

http://blog.csdn.net/lanxuezaipiao/article/details/41603883 导读 最近在补看《C Primer Plus》第六版&#xff0c;这的确是本好书&#xff0c;其中关于智能指针的章节解析的非常清晰&#xff0c;一解我以前的多处困惑。C面试过程中&#xff0c;很多面试官都喜欢问智能指针相…

非常可乐——BFS

【题目描述】 大家一定觉的运动以后喝可乐是一件很惬意的事情&#xff0c;但是seeyou却不这么认为。因为每次当seeyou买了可乐以后&#xff0c;阿牛就要求和seeyou一起分享这一瓶可乐&#xff0c;而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子&#xff0c;它们的容…

整型数据存储

//代码1 #include<stdio.h> int main() {char a -1;signed char b -1;unsigned char c -1;printf("a %d, b %d, c %d", a, b, c);return 0; } 1000 0000 0000 0001 -> -1源码 1111 1111 1111 1110 -> -1反码 1111 1111 1111 1111 -> -1补码 对于…

聊聊gcc参数中的-I, -L和-l

http://blog.csdn.net/stpeace/article/details/49408665 在本文中&#xff0c; 我们来聊聊gcc中三个常见的参数&#xff0c; 也即-I, -L和-l 一. 先说 -I (注意是大写的i) 我们先来看简单的程序&#xff1a; main.c: [cpp] view plaincopy #include <stdio.h> #incl…

Pots——BFS

【题目描述】 You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i) empty the pot i to the drain; POUR(i,j) pour from pot i to pot j;…

HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

【题目描述】 HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations. Operation 1: Add c to each number between ax …

[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1. 主版本模板类 首先我们来看一段初学者都能看懂&#xff0c;应用了模板的程序&#xff1a; 1 #include <iostream>2 using namespace std;3 4 template<class T1, class T2>5 clas…

自定义类型: 结构体,枚举,联合

1.结构体 个人认为结构体和数组特别相似&#xff0c;只不过结构体和数组的区别在于结构体的成员可以是不同类型&#xff0c;而数组成员类型是相同的。 &#xff08;1&#xff09;结构体的声明 struct tag {成员列表//至少得有一个成员 }值列表;//值列表可以省略 struct {int a…

详解C++中的函数调用和下标以及成员访问运算符的重载

http://www.jb51.net/article/78436.htm 这篇文章主要介绍了详解C中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下函数调用 使用括号调用的函数调用运算符是二元运算符。 语法 ?1primary-expression ( expression-list )备…