水灾(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

最新文章

  1. ZOJ 3805 (树形DP)
  2. Ubuntu 通过Deb安装 MySQL5.5(转载)
  3. Codeforces Round #206 div1 C
  4. java中动态反射
  5. 【JS跨域请求】Ajax跨域请求JSONP
  6. ubuntu14.04 install flow.
  7. 将含有父ID的列表转成树
  8. Hexo学习笔记--常用命令及部署步骤
  9. coursera上的软件安全课程的课后阅读补充
  10. 2.一步一步学c#(二):核心c#
  11. 将默认首页设置成index.do的方法
  12. 【HTTP 2】 序言
  13. HDU4144:Bacon&#39;s Cipher
  14. 在VS中配置并测试opencv
  15. 最大流isap模板
  16. 阻止form空表单提交----JavaScript
  17. C语言--第一周作业(更改)
  18. bzoj 4545: DQS的trie
  19. 数据库连接(1)-从JDBC到MyBatis
  20. C# -- 使用Ping检查网络是否正常

热门文章

  1. SpringBoot开始多线程
  2. 前端开发: webStorm手机真机调试
  3. Java8 新特性2——强大的Stream API
  4. 牛客网剑指offer第34题——找到第一个只出现一次的字符
  5. webpack知识锦集(一)
  6. HTTPS 笔记
  7. C#桌面开发的未来-WebWindow
  8. Redis(7)——持久化【一文了解】
  9. Java中的IO与NIO
  10. 为.net Core 3.0 WebApi 创建Linux守护进程