题解1235. 洪水 (Standard IO)

Posted tianbowen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解1235. 洪水 (Standard IO)相关的知识,希望对你有一定的参考价值。

Description


一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安
全的。
森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而
岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
有以下几点需要说明:
1、 每一分钟画家能向四个方向移动一格(上、下、左、右)
2、 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
3、 洪水和画家都不能通过岩石区域
4、 画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)
5、 洪水蔓不到画家的住所。
给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。
 

Input

输入第一行包含两个整数R和C(R,C<=50)。
接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。地图保证只有一个“D”和一个“S”。

Output

输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。
 

Sample Input

输入1:
3 3 
D.* 
... 
.S. 

输入2:
3 3 
D.* 
...
..S

输入3:
3 6 
D...*. 
.X.X.. 
....S. 

Sample Output

输出1:
3

输出2:
KAKTUS 

输出3:
6

 

  这道题主要考的是bfs和预处理,我们模拟一下就能过,因为它的数据太蒻。

  首先,我们读入整个地图,不断地扫描整个地图,然后每一次发现岩浆就将它合法扩散。

  然后我们处理人,这就要跑一遍bfs了,找到就输出,不然就输出KAKTUS。

下面上代码:

#include<iostream>
#include<cstdio>
using namespace std;
int tim,n,m,last;
bool p;
char mp[200][200][200];
void before()
    for(int i=1;i<=180;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=m;k++)
                if(mp[j][k][i-1]==*)
                    if(mp[j+1][k][i]!=D&&mp[j+1][k][i]!=X) mp[j+1][k][i]=*;
                    if(mp[j][k+1][i]!=D&&mp[j][k+1][i]!=X) mp[j][k+1][i]=*;
                    if(mp[j-1][k][i]!=D&&mp[j-1][k][i]!=X) mp[j-1][k][i]=*;
                    if(mp[j][k-1][i]!=D&&mp[j][k-1][i]!=X) mp[j][k-1][i]=*;
                
            
        
    

int main()
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>mp[i][j][0];
            for(int k=1;k<=180;k++)
                mp[i][j][k]=mp[i][j][k-1];
                
        
    
    before();
    while(tim<=180)
        tim++;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(mp[i][j][tim-1]==S)
                    if(mp[i+1][j][tim]==D)
                        cout<<tim;
                        return 0;
                    
                    if(mp[i][j+1][tim]==D)
                        cout<<tim;
                        return 0;
                    
                    if(mp[i-1][j][tim]==D)
                        cout<<tim;
                        return 0;
                    
                    if(mp[i][j-1][tim]==D)
                        cout<<tim;
                        return 0;
                    
                    if(mp[i+1][j][tim]==.) mp[i+1][j][tim]=S;
                    if(mp[i][j+1][tim]==.) mp[i][j+1][tim]=S;
                    if(mp[i-1][j][tim]==.) mp[i-1][j][tim]=S;
                    if(mp[i][j-1][tim]==.) mp[i][j-1][tim]=S;
                
            
        
    
    cout<<"KAKTUS";

 

 

 

 

谢谢阅读

 

以上是关于题解1235. 洪水 (Standard IO)的主要内容,如果未能解决你的问题,请参考以下文章

[POI2007]洪水pow 题解

题解洪水

洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)

BFS洪水

1235 - Coin Change (IV)

2644. 数列 (Standard IO)