水灾(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. criteria.setCacheable(true);这个方法是干什么用的

    criteria.setCacheable(true); 一下是Criteria的底层源代码 /** * Enable caching of this query result, provided q ...

  2. CSS 学习笔记——CSS Selector

    CSS1 中定义的选择器 类型选择器 用于选择指定类型的元素(其实他就是 html 标签选择器),常见用法如下: body { /*对 body 元素定义样式*/ } body,div { /*同时选 ...

  3. electron+vue制作桌面应用--自定义标题栏

    electron会默认显示边框和标题栏,如下图 我们来看一下如何自定义一个更加有(gao)意(da)思(shang)的标题栏,例如网易云音乐这种 首先我们要把默认的标题栏删掉,找到主进程中创建窗体部分 ...

  4. apache搭建Tomcat集群(Cluster)

    搭建集群: apache:特点处理静态资源(html  图片  js等) apache的请求操作,Cluster工具 tomcat:特点处理动态资源 apache+tomcat(apache是web服 ...

  5. linux 安装Mosquitto

    这篇博客讲的很好:https://www.cnblogs.com/chen1-kerr/p/7258487.html 此处简单摘抄部分内容 1.下载mosquitto安装包 源码地址:http://m ...

  6. js之重写原型对象

    “实例中的指针仅指向原型,而不是指向构造函数”. “重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的关系:它们引用的仍然是最初的原型”.——前记 var fun = function(){ ...

  7. DOM解读

    DOM解读 DOM概念 - document object model:文档对象模型 操作文档的一套方法,document是一个对象,是dom的顶级对象,属于window的一个对象,并且可以说是最出色 ...

  8. C++ 动态链接库 dll的加载

    //首先生成一个my.dll项目,在cpp中添加如下代码 //导出函数 _declspec(dllexport) int test(int a, int b) { return a + b; } // ...

  9. npm 安装包总结

    1.前端可视化json:vue-json-viewer; 2.富文本编辑: vue-quill-editor;    https://www.cnblogs.com/ZaraNet/p/1020922 ...

  10. node 微信授权 获取openid

    node获取微信授权拿到openid 需要了解的网站   1.微信授权. 先说一下流程(一张图代替所有): 流程步骤: 1.用户同意,获取code. 2.通过code获取网页授权access_toke ...