BFS洪水
试题描述:
已经连续下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。
CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。
CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。
求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。
输入:
第一行:N和M
接下来N行,每行M个字符,表示地图。
输出:
若能回家,输出一个整数,表示最少回家步数;否则输出“ORZ hzwer!!!”。
输入示例:
3 3
D.*
...
.S.
输出示例:
3
良心输入示例:
...SXX...XX...X...XX.XX....X.......X....X.X....*X.
.XX.X..XX.X.X..X.X.X...XX.X.....X....X...X.XX....X
..X..X....X.X.X.X.XX....XX...X..XX....X...XXX...XX
X.....X..XXX.XX..X.X.X........XXX....X.X..XX..X...
X..X.....X......X.......X..X......X.....X.X..X....
......XXX..X..XX.X.......X..X......X.X.XXX.X..X...
...X...XX.X..X.........X..XX..XX.X..X.X....X..X..X
XX.........XX.XXX.XXX...X..X..XXX.XX.X..X...X.X.X.
.....X...X..X.X.X.....X.X.X...XX........XX..X..X..
XXXX..XX..X..X..X..XXX..X...X..X.X...X..XX.XX.X...
......X..X....X.........XX..X..X........X.XX...X.X
X..XX...X........X........XXXX.XX.........X.X.XXX.
.....XXX...X.XXX....X...XX........X...XXXX...X....
.X.XX....XXX...X...X...X.X...XXX...X...X..XX.XX...
...XXX....XXX.....X.X...XX...X.X.XXX.X.XX..X......
.......X..XX.X.X..........X.XX..X..X.XX.XXXX...XX.
X...X.X.X.XXX.X..X.XXX..X...X....X.X..X...X..XX..X
..X..X.XX..X.XXX..X...X..X..X..X.X....X..........X
XX....X.X.X.XX.....X..XXXX.XX..X....X.....X.....X.
.XX.....X.X..X..X.X...X......X....X..X.XX.XX.XX.X.
.....X.........X..X.X...X....XX.X...X..X..XX.XX...
.X........X..XX..X...X....XX.XXX.XX.X..X...X...XXX
...X.X.XX...X......XX.X.XXX..X.X.XX....XXX.X...X..
....X.....XX..XX.X.X...X..X.X....X.....XX.XX..XXX.
....X........XXXXXX.........XX..X....XX.XXXX......
..XX.XXX.X...X.X.X.X..XXXX....X.X.X...XX.X..X..X..
XX..XX.X...X....XX....X.......X..X.X......XXXXX...
XX..XX.XX.X..X...XX....XX.X..X...X.X....X.........
..X.....X...X..X.........X......X...XX.XX...X.....
X.X..XX.X.X.X.XXXX.X...X..X...XX..X.....X.X.XXX...
..X....X.X.X......X..X...XX..X...X.X.XXX.X....XX.X
X.....X.X...XXXXX.....X..XX...X....X...XXX....X...
.XXX...XXXX.X....X...XX.XX..X.X........X...X....X.
..XXX.XX....X.XX.X..X...X.X.X.....X...X....X.XXXXX
.XX...X.X....XXX......X.....X....X.X..X..X....XX.X
XX..XX.X....X...XXX....X..XXX.XXX.X.X....X.X......
XX....X.X....X..X.XX...X..X.X....X..XX...XX...X...
X.X...X...X..X....X.X.........X...X...X....X..X...
.X...X...X.X....X.....XX......XXX..XX.XX.X.....X..
..X.X..XX.X..X..........X.X.XX..X..X.X.XXXX.......
..X...XX.X.X..XX..XXXXX...X........XX...X.X..X..XX
.....X..XXX....X.XX....XX.XX..XX.X....XX.XX..X.XXX
X..X.XX.X.X.......X.X.X..X......X..XX....X.XXX.XXX
X..XXXX.........X..X..X............X.X..X..X...X..
X...XX.XX...X........X....X....X.X...X..XD...X..X.
......X.......XXXX..XXX.....X.X.X.X..........X....
X.....XX.XX.XXX.XX.X.X..X.X.......XXXX.....X...XXX
.X..XX..X.....XX...XX..X.....XX...X..X....X..X..XX
X....XX....XX.....XX.X.XXX....X.......X..X....X..X
X.....XX..XX.X.....XX....X..X..X.X.XX.......X..X..
良心输出示例:
解题思路:
这是一道神奇的题目,我用了一天。。。。。
首先,我写了一个DFS+BFS,然后结果错误。
接着,改成预处理,创建一个step数组,step[i][j]表示洪水第几步漫道这里。
如:
3 3
D.*
...
.S.
的step是:
-1 1 0
3 2 1
4 3 2
这需要一个BFS
读入·时每遇到一个*就把它丢到队列里面,
然后正常BFS。
预处理以后,就再正常地BFS
然后就好了。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
int map[][];
int step[][];
int book[][];
int startx, starty;
int endx,endy;
queue <int> Qx;
queue <int> Qy;
int n, m;
int ans = ;
int wnum = ;
void getstep()
{
while(!Qx.empty())
{
int kx = Qx.front();
int ky = Qy.front();
Qx.pop();
Qy.pop();
if(map[kx-][ky]== && step[kx-][ky]>step[kx][ky]+ && kx->)
{
Qx.push(kx-);
Qy.push(ky);
step[kx-][ky]=step[kx][ky]+;
}
if(map[kx+][ky]== && step[kx+][ky]>step[kx][ky]+ && kx+<=n)
{
Qx.push(kx+);
Qy.push(ky);
step[kx+][ky]=step[kx][ky]+;
}
if(map[kx][ky-]== && step[kx][ky-]>step[kx][ky]+ && ky->)
{
Qx.push(kx);
Qy.push(ky-);
step[kx][ky-]=step[kx][ky]+;
}
if(map[kx][ky+]== && step[kx][ky+]>step[kx][ky]+ && ky+<=m)
{
Qx.push(kx);
Qy.push(ky+);
step[kx][ky+]=step[kx][ky]+;
}
}
}
int main()
{
memset(book,,sizeof(book));
memset(step,,sizeof(step));
cin>>n>>m;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
char c;
cin >> c;
if (c == 'S')
{
startx = i;
starty = j;
}
if (c == '*')
{
Qx.push(i);
Qy.push(j);
step[i][j]=;
}
if (c == 'D')
{
endx=i;
endy=j;
map[i][j]=;
}
if (c == 'X')
map[i][j] = -;
}
getstep();
queue <int> qx;
queue <int> qy;
qx.push(startx);
qy.push(starty);
book[startx][starty]=;
while(!qx.empty())
{
int kx=qx.front();
int ky=qy.front();
qx.pop();
qy.pop();
if(map[kx][ky]==)
break;
if((map[kx-][ky]== || map[kx-][ky]==) && book[kx-][ky]>book[kx][ky]+ && step[kx-][ky]>book[kx][ky]+ && kx->=)
{
qx.push(kx-);
qy.push(ky);
book[kx-][ky]=book[kx][ky]+;
}
if((map[kx+][ky]== || map[kx+][ky]==) && book[kx+][ky]>book[kx][ky]+ && step[kx+][ky]>book[kx][ky]+ && kx+<=n)
{
qx.push(kx+);
qy.push(ky);
book[kx+][ky]=book[kx][ky]+;
}
if((map[kx][ky+]== || map[kx][ky+]==) && book[kx][ky+]>book[kx][ky]+ && step[kx][ky+]>book[kx][ky]+ && ky+<=m)
{
qx.push(kx);
qy.push(ky+);
book[kx][ky+]=book[kx][ky]+;
}
if((map[kx][ky-]== || map[kx][ky-]==) && book[kx][ky-]>book[kx][ky]+ && step[kx][ky-]>book[kx][ky]+ && ky->=)
{
qx.push(kx);
qy.push(ky-);
book[kx][ky-]=book[kx][ky]+;
}
}
if(book[endx][endy]>=)
cout<<"ORZ hzwer!!!";
else
cout<<book[endx][endy];
}
BFS洪水的更多相关文章
- [POI2007]洪水pow bfs
发现:只在所有自己的城市建水泵一定是最优解. 所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的 sort+bfs...... #inclu ...
- 【较复杂bfs】洪水-C++
描述 魔法森林的地图是R行C列的矩形.能通行的空地表示为'.',C君倾倒洪水的地点标记为'*',无法通行的巨石阵标记为'X',海狸的巢穴标记为'D',而画家和三只小刺猬的初始位置标记为'S'. 每一分 ...
- 洛谷 P4646 - [IOI2007] flood 洪水(拆点+bfs)
题面传送门 一道挺有意思的题(?) orz djq yyds %%%%%%%%%%%%%%%%%% 首先一个很直观的想法是将每个房间看作一个节点,在有墙的房间旁边连边权为 \(1\) 的边然后 bfs ...
- 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp
题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...
- opencv中的洪水填充算法
在图像处理里,如果我们需要填充一个区域,使该区域为相同的颜色,则比较常用的是洪水填充法.洪水填充法可以用DFS也可以用BFS实现. opencv下有函数实现该功能: CVAPI(void) cvFlo ...
- [POI2007]洪水pow
Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...
- codevs3411 洪水
题目描述 Description 小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵 ...
- [POI2007]洪水pow 题解
[POI2007]洪水pow 时间限制: 5 Sec 内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
随机推荐
- 阿里云一键web环境包
下载地址:https://files.cnblogs.com/files/wordblog/af3a48ef-3a13-479e-85c9-ead61173126c.zip 先把安装包传到服务器上用w ...
- Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法
1. 从网上下个elf.h放到scripts/mod/文件夹(http://www.rockbox.org/tracker/9006?getfile=16683) 2. 修改两个文件mk_elfcon ...
- Spring中的@Transactional事务注解
事务注解方式 @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: @Transactional public class TestServiceBean impl ...
- Eloquent中一些其他的create方法
firstOrCreate/ firstOrNew# 还有两种其它方法,你可以用来通过属性批量赋值创建你的模型:firstOrCreate 和firstOrNew.firstOrCreate 方法将会 ...
- redis局域网内开启访问
若需要开启A(192.168.0.3)的访问1.配置confg bind 192.168.0.3 2.设置访问密码 requirepass password 3.重新载入配置 ./redis-serv ...
- Linux打补丁的一个简单例子
前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要. diff与patch命令介绍 ...
- oracle相关命令收集-张
orcle相关命令收集 1,用管理员登陆 /as sysdba:2, 更改用户密码 alter user name identified by password: alter user exptest ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- Quartz任务调度入门
Quartz任务调度入门 了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念 ...
- Pandas DataFrame构造简析
参考书籍:<利用Python进行数据分析> DataFrame简介: DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔值等).Dat ...