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"; }
谢谢阅读
原文地址:https://www.cnblogs.com/tianbowen/p/11332013.html
时间: 2024-10-09 21:39:54