水灾(sliker.cpp/c/pas) 1000MS  64MB

大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。

CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。

CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。

求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。

输入文件 sliker.in

输出文件 sliker.out

Input

3 3

D.*

.S.

Output

3

Input

3 3

D.*

..S

Output

ORZ hzwer!!!

Input

3 6

D...*.

.X.X..

....S.

Output

6

-----------------------------------------------------------------------------------------------------------------------------------------

其实我相信所有人看见这道题都会想到BFS,而且会觉得很简单,我也不例外,但是我竟然还是错了5组数据,四组崩溃,一组WA,我一开始是以为我的BFS写挂了致使空间爆了

在加上之前的几道BFS都挂了,所以我一度对自己的BFS失去信心,直到现在才发现这道题错了纯属自己犯二。。。。。

这道题的思路很好想的,就是跑个BFS,只是有一点与正常BFS有些出入,就是在每一层运行时,要把所有时间点相同(即是要同一时刻的水和人遍历完后才运行下一层)

然后还要一点就是要先跑洪水再走人,因为如果人先走了,但是同时水也淹没了这个位置,那这个位置就是不能去的,但是先走人会把这个点标记成有人(当然这个可以后期处理,不过先水再人可以更好的理解,推荐用这种)

然后还有一个 小细节就是要对存水的队列判空,要不为空的时候才继续让水蔓延,否则会崩溃(如果存水的队列在为空时没有跳出,就会让程序崩溃,感兴趣的可以试试QAQ)

好了接下来就是发这个让我崩溃很久的水题的代码

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#define maxn 70
using namespace std; const int dx[]={-,,,};
const int dy[]={,,-,}; struct node{
int x,y,cnt;
}; queue<node>flood;
queue<node>ccy; int n,m,map[maxn][maxn],tot;
int sx,sy,fx,fy,real; int back()
{
for(int i=;i<;i++)
{
int ox=fx+dx[i],oy=fy+dy[i];
if(ox<||ox>n||oy<||oy>m)continue;
if(map[ox][oy]==||map[ox][oy]==)return false;//可以回家
}
return true;
} void people()
{
int zx=,zy=;
node f=ccy.front();
int tt=f.cnt;
while(tt==f.cnt){
f=ccy.front();
ccy.pop();
for(int i=;i<;i++)
{
zx=f.x+dx[i];zy=f.y+dy[i];
if(map[zx][zy]==||map[zx][zy]==-||map[zx][zy]==)continue;
if(zx<||zx>n||zy<||zy>m)continue;
map[zx][zy]=;
ccy.push((node){zx,zy,f.cnt+});
if(zx==fx&&zy==fy)
{
printf("%d ",f.cnt+);real=;return;
}
}
f=ccy.front();
}
} void water()
{
int zx=,zy=;
if(!flood.empty())
{
node e=flood.front();
int cn=e.cnt;
while(e.cnt==cn)
{
e=flood.front();
flood.pop();
for(int i=;i<;i++)
{
zx=e.x+dx[i];zy=e.y+dy[i];
if(map[zx][zy]==-||map[zx][zy]==)continue;
if(zx<||zx>n||zy<||zy>m)continue;
if(zx==fx&&zy==fy)continue;
map[zx][zy]=;
flood.push((node){zx,zy,e.cnt+});
}
e=flood.front();
}
}
} void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
char c[];
scanf("%s",c);
for(int j=;j<m;j++)
{
if(c[j]=='X')
map[i][j+]=-;
if(c[j]=='S')
{sx=i,sy=j+;ccy.push((node){i,j+,});}
if(c[j]=='D')
fx=i,fy=j+;
if(c[j]=='*')
map[i][j+]=,flood.push((node){i,j+,});
}
}
} int main()
{
freopen("sliker.in","r",stdin);
freopen("sliker.out","w",stdout);
read();
map[sx][sy]=;
while(!ccy.empty()&&!back())
{
water();
people();
if(real==)return ;
}
printf("ORZ hzwer!!!");//注意细节
}

-------------分界线QWQ--------------接下来我再提供几组数据

1.in

10 10
D..........
...........
...........
...........
...........
...........
........S..
...........
...........
...........

1.out

14

2.in

10 15
........X......
..XXXXX.X.*....
X.....X.X..*...
.X.S..X.X......
D.X...X.XXXXX..
.X....X........
.X....X.XXXXXXX
.XXXXXX.X......
........X......
XXXXXXXXX...*..

2.out

ORZ hzwer!!!

3.in

50 50
D.................................................
.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.XX.............................................X.
...*............................................X.
.XX.............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
.X..............................................X.
SXXXXXXXXXXXXXXXXXXXXXXXX.X.XXXXXXXXXXXXXXXXXXXXX.
..........................X.......................

3.out

152

[noip模拟]水灾<BFS>的更多相关文章

  1. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  2. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  3. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  4. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  5. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIP 模拟赛

    NOIP 模拟赛 思路:求 n , m 的 gcd,然后用 n , m 分别除以 gcd:若 n 或 m 为偶数,则输出 1/2. 特别的,当 n = m = 1 时,应输出 1/1 #include ...

  8. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  9. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

随机推荐

  1. JAVA GC算法详解

    生存还是死亡 对象是否需要被垃圾收集器回收主要有两种方式:引用计数法和可达性分析算法 引用计数法 给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器的数值就+1,当引用失效时,计数器就-1: ...

  2. python版md-to-html编辑器

    用PyQt5封装python-markdown,支持自定义样式. 详情:https://blog.phyer.cn/article/4523

  3. 原生php导出csv文件

    require('./db/dbManager.php'); require('./session.php'); require('./department_utils.php'); class Ex ...

  4. 用 git 钩子,检测代码规范性(eslint、standard)

    最终实现效果说明:用 git commit 提交代码之前,利用 pre-commit git 钩子,实现代码规范检测(eslint.standard 规范),符合规范之后才可以提交到 git 仓库.这 ...

  5. YiGo表单建立

    做一个请假单表单(下图是最后的成品图) 表单的类型 实体表单 1.可存储 2.可编辑 虚拟表单 视图(不可存储数据,只有显示功能) 不可编辑 字典 报表 备注 :一张表单是实体还是虚拟取决于其数据对象 ...

  6. 【猫狗数据集】谷歌colab之使用pytorch读取自己数据集(猫狗数据集)

    之前在:https://www.cnblogs.com/xiximayou/p/12398285.html创建好了数据集,将它上传到谷歌colab 在colab上的目录如下: 在utils中的rdat ...

  7. 没想到MySQL还会问这些...

    前言 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在前一阵子,大哥问过我:"你知道MySQL的原子性是怎么保 ...

  8. spring boot 调度任务

    1.引入spring boot所依赖的jar包  <parent> <groupId>org.springframework.boot</groupId> < ...

  9. Function.prototype.call.apply()方法

    在看uncurrying化函数时候,碰到了Function.prototype.call.apply()的用法: 先说说uncurrying()函数: Function.prototype.uncur ...

  10. Docker Compose + Traefik v2 快速安装, 自动申请SSL证书 http转https 初次尝试

    前言 昨晚闲得无聊睡不着觉,拿起服务器尝试部署了一下Docker + Traefik v2.1.6 ,以下是一些配置的总结,初次接触,大佬勿喷. 我的系统环境是 Ubuntu 18.04.3 LTS ...