试题描述:

已经连续下了几天雨,却还是没有停的样子。土豪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洪水的更多相关文章

  1. [POI2007]洪水pow bfs

    发现:只在所有自己的城市建水泵一定是最优解. 所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的 sort+bfs...... #inclu ...

  2. 【较复杂bfs】洪水-C++

    描述 魔法森林的地图是R行C列的矩形.能通行的空地表示为'.',C君倾倒洪水的地点标记为'*',无法通行的巨石阵标记为'X',海狸的巢穴标记为'D',而画家和三只小刺猬的初始位置标记为'S'. 每一分 ...

  3. 洛谷 P4646 - [IOI2007] flood 洪水(拆点+bfs)

    题面传送门 一道挺有意思的题(?) orz djq yyds %%%%%%%%%%%%%%%%%% 首先一个很直观的想法是将每个房间看作一个节点,在有墙的房间旁边连边权为 \(1\) 的边然后 bfs ...

  4. 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp

    题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...

  5. opencv中的洪水填充算法

    在图像处理里,如果我们需要填充一个区域,使该区域为相同的颜色,则比较常用的是洪水填充法.洪水填充法可以用DFS也可以用BFS实现. opencv下有函数实现该功能: CVAPI(void) cvFlo ...

  6. [POI2007]洪水pow

    Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...

  7. codevs3411 洪水

    题目描述 Description 小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵 ...

  8. [POI2007]洪水pow 题解

    [POI2007]洪水pow 时间限制: 5 Sec  内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...

  9. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

随机推荐

  1. dataTables.js 响应式/package-lock.json 作用/eclipse 目录和工作区建立连接/navcat 导出数据库/vscode 快速进入方法

    下班时间到啦! --下班都是他们的,而我,什么都没有. 什么周五放松日,什么五四青年节,什么都么有.继续总结一下今天遇到的问题. dataTables.js 响应式 使用dataTables.js创建 ...

  2. NASA: A Closer View of the Moon(近距离观察月球)

    Posted to Twitter by @Astro_Alex, European Space Agency astronaut Alexander Gerst, this image shows ...

  3. 【shell】shell编程(五)-读取参数

    通过前几篇文章的学习,我们学会了shell的基本语法.在linux的实际操作中,我们经常看到命令会有很多参数,例如:ls -al 等等,那么这个参数是怎么处理的呢? 接下来我们就来看看shell脚本对 ...

  4. KKT条件和拉格朗日乘子法详解

    \(\frac{以梦为马}{晨凫追风}\) 最优化问题的最优性条件,最优化问题的解的必要条件和充分条件 无约束问题的解的必要条件 \(f(x)\)在\(x\)处的梯度向量是0 有约束问题的最优性条件 ...

  5. 利用__attribute__((section()))构建初始化函数表【转】

    转自: https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652663356&idx=1&sn=7797629530 ...

  6. 64_r1

    R-3.4.0-2.fc26.x86_64.rpm 15-May-2017 14:49 31030 R-ALL-1.6.0-4.fc26.noarch.rpm 17-Feb-2017 22:05 11 ...

  7. 设置网卡IP,还每次都挨个地址输入吗?批处理一下【转】

    1.设置网卡ip,子网掩码和默认网关,注意修改网卡名称,跟本地连接汇总的网卡名称保持一直 netsh interface ip set address "以太网" static 1 ...

  8. Machine Learning系列--深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...

  9. HOJ 1108

    题目链接:HOJ-1108 题意为给定N和M,找出最小的K,使得K个N组成的数能被M整除.比如对于n=2,m=11,则k=2. 思路是抽屉原理,K个N组成的数modM的值最多只有M个. 具体看代码: ...

  10. python实现链式调用

    在python中实现链式调用只需在函数返回对象自己就行了. class Person: def name(self, name): self.name = name return self def a ...