描述

魔法森林的地图是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. C# Excel导入Access

    /// <summary> /// 导入 /// </summary> private void btn_In_Click(object sender, EventArgs e ...

  2. SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明

    原文:SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明 DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKF ...

  3. js判断图片是否存在

    var imageData = Array(); for(var i = 0; i < imageTemp.length; i++){ ajaxSizeRequest = $.ajax({ ty ...

  4. CUDA配置

    你问这个有多恶心,是真的很恶心!!! 首先推出一个博客上的内容,里面内容很不错,都是前车之鉴,很有用.http://blog.csdn.net/masa_fish/article/details/51 ...

  5. Qt使用windows API获取程序运行时占用内存 good

    使用的是psapi.h中的GetProcessMemoryInfo函数,但是运行到该函数时就强制退出了. 后来,百度到原因是 原来Qt编译时加了-mthread,createprocess时要使的Ha ...

  6. CentOS7 firewall与iptables防火墙的使用与开放端口

    如何关闭firewall并开启iptables防火墙 如何使用firewall防火墙 如何关闭firewall并开启iptables防火墙 1.停止firewall systemctl stop fi ...

  7. MAC和PHY的区别(网线上传递的是模拟信号)

    一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  8. Spring Cloud全链路追踪实现(Sleuth+Zipkin+RabbitMQ+ES+Kibana)

    简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...

  9. Django之F、Q查询,事务,自定义char字段

    F查询 from django.db.models import F,Q # 当查询条件来自于数据库的某个字段,这个时候就必须使用F # 查询卖出数大于库存数的商品 res = models.Prod ...

  10. vue2.0父子组件以及非父子组件通信传参详解

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...