码迷,mamicode.com
首页 > 其他好文 > 详细

题解1235. 洪水 (Standard IO)

时间:2019-08-10 17:22:02      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:using   区域   inpu   while   sam   false   接下来   通过   col   

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)

标签:using   区域   inpu   while   sam   false   接下来   通过   col   

原文地址:https://www.cnblogs.com/tianbowen/p/11332013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!