#2612:Find a way(BFS搜索+多终点)
第一次解决双向BFS问题,拆分两个出发点分BFS搜索
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 210;
char city[maxn][maxn];
bool visited[maxn][maxn];
int yx, yy, mx, my; //两人的起始点
int kfc[maxn][maxn]; //到达第i,j位置的kfc所需花费的时间(确保该地有kfc)
int action[][2] = { {1,0}, {-1,0}, {0,1}, {0,-1} };
int n, m;
struct Node {
int x, y, steps;
Node(int xx, int yy, int ss) :x(xx), y(yy), steps(ss) { }
};
queue<Node> q[2]; //分别表示两人
void Bfs(int p)
{
memset(visited, 0, sizeof(visited)); //初始化
if (p == 0) {
q[p].push(Node(yx, yy, 0));
visited[yx][yy] = 1;
}
else {
q[p].push(Node(mx, my, 0));
visited[mx][my] = 1;
}
while (!q[p].empty()) {
Node cur = q[p].front();
q[p].pop();
//扩展cur
for (int i = 0; i < 4; i++) {
int sx = cur.x + action[i][0], sy = cur.y + action[i][1];
//为.路(MY也视为路)
if ((sx > 0 && sx <= n && sy > 0 && sy <= m) && !visited[sx][sy] && (city[sx][sy] == '.' || city[sx][sy] == 'M' || city[sx][sy] == 'Y')) {
q[p].push(Node(sx, sy, cur.steps + 1));
visited[sx][sy] = 1;
}
//为@kfc
else if ((sx > 0 && sx <= n && sy > 0 && sy <= m) && !visited[sx][sy] && city[sx][sy] == '@') {
kfc[sx][sy] += cur.steps + 1; //两人步数之和
q[p].push(Node(sx, sy, cur.steps + 1)); //@同样要入队列
visited[sx][sy] = 1;
}
}
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF) {
memset(kfc, 0, sizeof(kfc)), memset(city, '#', sizeof(city));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
scanf(" %c", &city[i][j]);
if (city[i][j] == 'Y') yx = i, yy = j;
else if (city[i][j] == 'M') mx = i, my = j;
}
Bfs(0);
Bfs(1);
int ans = 1 << 30; //从各个kfc路径中选出最短的
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (kfc[i][j] != 0 && kfc[i][j] < ans) ans = kfc[i][j];
printf("%d\n", ans * 11);
}
return 0;
}
#2612:Find a way(BFS搜索+多终点)的更多相关文章
- HDU 2612 (BFS搜索+多终点)
题目链接: http://poj.org/problem?id=1947 题目大意:两人选择图中一个kfc约会.问两人到达时间之和的最小值. 解题思路: 对于一个KFC,两人的BFS目标必须一致. 于 ...
- hdu 1240:Asteroids!(三维BFS搜索)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- BFS搜索
参考博客:[算法入门]广度/宽度优先搜索(BFS) 适用问题:一个解/最优解 重点:我们怎么运用队列?怎么记录路径? 假设我们要找寻一条从V0到V6的最短路径.(明显看出这条最短路径就是V0-> ...
- hiho_1139_二分+bfs搜索
题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值. 题目链接:二分 最小化最大值,考虑采用二分搜索.对所有的边长进 ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Horse Pro(带负坐标的bfs搜索)
Horse Pro bfs搜索,但图中存在负值坐标,两种方法解决. 用数组标记,将原点设为300,300 用map标记 http://oj.jxust.edu.cn/contest/Problem?i ...
- 天梯赛练习 L3-008 喊山 (30分) bfs搜索
题目分析: 本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜 ...
- HDU - 2612 Find a way(BFS搜索)
题目: 链接 思路: 用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值. PS: 如果用‘Y’和‘M’点分别去搜每个 ...
- poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
题目地址:http://poj.org/problem?id=3083 Sample Input 2 8 8 ######## #......# #.####.# #.####.# #.####.# ...
- HDU 2364 (记忆化BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2364 题目大意:走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往 ...
随机推荐
- python之继承的方法重写
目录 普通方法 方法重写super().xxx() 我们在python之继承及其实现方法中已经学会了打印子类在父类继承的属性 那么我们怎么打印出子类中特有的属性呢 普通方法 我们当然可以在子类中添加新 ...
- Android学习day03【跑马灯】
这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...
- uniapp---wap2app去掉系统自带的导航栏
在用uniapp进行将wap站转化为app的时候,默认打包后的文件,带有系统的导航栏,下面是去除的办法: 第一步:找到 sitemap.json 设置 titleNView为false: 第二步:在 ...
- force语句
类似于assign,用于调试,可以强制给赋值,放在initial后,可以穿透到最内部模块. force (强制赋值操作)与 release(取消强制赋值)表示第二类过程连续赋值语句. 使用方法和效果, ...
- 使用nacos配置无效,原因:项目中 gateway服务配置的 application的name:@artifactId@ 和nacos上配置的DataID 不一致导致
遇到一个问题,项目启动后一致无法正常登陆进入后端,登陆时一直报错返回null,排查后发现是自己粗心,项目中 gateway服务配置的 application的name:@artifactId@ 和 ...
- [ARC122D] XOR Game
Problem Statement There are $2N$ integers written on a blackboard. The $i$-th integer is $A_i$. Alic ...
- Java在指定路径下执行cmd命令的方法
目前状态:毕业设计ing 背景: 做毕设时,由于需要将python的运行效果展示出来,所以使用了Java写了一个前端的界面.但是在使用Java对python的脚本进行调用时就尴尬了,出错-- 这里也许 ...
- windows端口被占用怎么办?
简单只需要按照一下命令查找到对应的端口kill掉就好了 1.查看本机所有的端口信息 netstat -ano 2.查看本机指定端口信息 netstat -ano | findstr "端口号 ...
- 三种方式查询三级分类Tree
话不多说,直接上代码 方式一:for循环嵌套一下 /** * 查询三级分类 * * @return */ @Override public List<GoodsType> findNode ...
- 为啥不建议用BeanUtils.copyProperties拷贝数据
在实际的业务开发中,我们经常会碰到VO.BO.PO.DTO等对象属性之间的赋值,当属性较多的时候我们使用get,set的方式进行赋值的工作量相对较大,因此很多人会选择使用spring提供的拷贝工具Be ...