描述

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

每一分钟,画家和三个小刺猬可以走到相邻(上、下、左或右)的四个空地之一。与此同时,洪水每一分钟也会扩大到相邻(上、下、左或右)的所有的空地。一旦空地被淹没,就无法再通行。洪水无法通过巨石阵。但是海狸的巢穴建在很高的地方,永远不会淹没。

注意,画家和三只小刺猬无法进入即将被淹没的空地,即如果他们与洪水在同一分钟到达某个空地,就不能进入。

编写一个程序,给定一个魔法森林的地图,输出为了让画家和三只小刺猬安全地到达海狸的巢穴所需的最短时间。

输入
第1行:2个整数R,C 接下来R行,每行C个字符 ('.', '*', 'X', 'D' 或 'S') 地图只含有恰好1个'D'和1个'S',而'*'可能有零个或多个 输出
1个整数,表示最短的到达狸的巢穴所需的时间。如果无法到达,输出"KAKTUS" 输入样例 1 3 6
D...*.
.X.X..
....S.
输出样例 1 6
输入样例 2 3 3
D.*
...
..S
输出样例 2 KAKTUS
输入样例 3 3 3
D.*
...
.S.
输出样例 3 3
提示 数据规模: 1<= N, M <= 1000

思路:找到所有洪水打进队列,先深搜一次,新开一个二维数组a,表示洪水会在第a[i][j]秒到达位置(i,j),然后第二次搜索的时候的限制条件就只需要判断,目前时间加一是否小于等于下一步要走的点即可,这道题就难在需要两次搜索。

代码如下

//基于把所有信息糅合到一个标记数组...

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, m;
int a[maxn][maxn];
int x_1, y_1, x_2, y_2; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; bool in(int x, int y)
{
return 1 <= x && x <= n && 1 <= y && y <= m;
}
queue<pair<int, int> > qu;
void bfs1()
{
while(!qu.empty())
{
int x = qu.front().first;
int y = qu.front().second;
qu.pop();
for(int i = 0; i < 4; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(in(tx, ty) && a[tx][ty] == 0)
{
qu.push(make_pair(tx,ty));
a[tx][ty] = a[x][y] + 1;
}
}
}
} int bfs2()
{
queue<pair<int, int> > qu;
qu.push(make_pair(x_1, y_1));
a[x_1][y_1] = -1;
while(!qu.empty())
{
int x = qu.front().first;
int y = qu.front().second;
qu.pop();
for(int i = 0; i < 4; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(tx == x_2 && ty == y_2)
return abs(a[x][y]);
if(in(tx, ty) &&(abs(a[x][y]-1) < a[tx][ty] || a[tx][ty]==0) )
{
qu.push(make_pair(tx,ty));
a[tx][ty] = a[x][y]-1;
}
}
}
return -1;
} int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
char ch;
cin >> ch;
if(ch == 'X') a[i][j] = -1;
if(ch == 'S') x_1 = i, y_1 = j;
if(ch == 'D') x_2 = i, y_2 = j, a[i][j]=-1;
if(ch == '*'){qu.push(make_pair(i,j));a[i][j]=1;}
}
} bfs1();//void
int ans = bfs2();
if(ans == -1)
cout << "KAKTUS" << endl;
else
cout << ans << endl;//int return 0;
}

ov.

【较复杂bfs】洪水-C++的更多相关文章

  1. BFS洪水

    试题描述: 已经连续下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图 ...

  2. [POI2007]洪水pow bfs

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

  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. DBLINK学习

    1.连接本地scott用户查看拥有的表 [oracle@ORADG ~]$ sqlplus scott/tiger SQL> select * from tab; TNAME           ...

  2. List<T>多字段排序的一个通用类

    本文中的方法旨在解决通用的问题,非常注重效率的地方,还应该针对具体的类去写排序方法. 废话不多说,直接上代码 具体使用场景: 要排序的类 1 public class bb 2 { 3 public ...

  3. .NET Core整合log4net以及全局异常捕获实现2

    Startup代码 public static ILoggerRepository repository { get; set; } public Startup(IConfiguration con ...

  4. 一键增加swap空间脚本

    #!/bin/bash echo -e "\033[33m Your current swap is \033[0m" free -h mkdir /SwapDir cd /Swa ...

  5. std::string的Copy-on-Write:不如想象中美好(VC不使用这种方式,而使用对小字符串更友好的SSO实现)

    Copy-on-write(以下简称COW)是一种很重要的优化手段.它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源. ...

  6. [每天记录一个Bug]Cell中由于block加载网络请求产生的复用

    Bug 出现场景:   cell中使用加载图片的网络请求出现复用,截图如下:         复用原因:   Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 ...

  7. 文件文件夹混合多选对话框(修改GWL_WNDPROC)

    /******************************************************************** created: 2008/07/22 created: 2 ...

  8. 响应式与bootstrap

    一.单双击问题 <body> <button>按钮</button> <script src="./jQuery.js"></ ...

  9. 设置windows服务依赖项

    场景还原:python2.7开发的项目,制作成了windows服务,随系统启动.系统重启后发现服务未能自动启动,检查事件查看器日志发现服务先于Mysql数据库服务启动,由于服务中必须对MySQL进行访 ...

  10. 10 table标签

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...