赵老师的卡皮巴拉生活在一个 n×n 的方形乐园内。乐园内有一些障碍物(用#表示)。
一天,卡皮巴拉乐园的水管有多处漏水了!!!漏出的水每过1分钟回蔓延到前、后、左、右四个方向的格子里。
为了躲避漏出的水,卡皮巴拉想请你帮它一个忙,就是计算出漏出的水蔓延到每个格子的时间(水会绕开障碍物),这样它就可以待在安全的地方,等赵老师回来修好水管。
输入描述
第一行两个整数 n 和 m,代表卡皮巴拉乐园的大小(5 <= n <= 30),和卡皮巴拉询问你的次数。
接下来 n 行输入一张地图,‘.’代表地面,‘#’代表障碍物,‘*’代表漏水点。
接下来 m 行是卡皮巴拉询问你的位置的坐标(从1开始)。
注意:漏水点有多个位置 !!!
输出描述
漏出的水蔓延到询问的格子位置的时间(单位:分钟),每行输出一个结果。
注意:
如果询问的位置是障碍物,则输出“#”。
如果询问的位置不会被水淹没(被障碍物阻挡),则输出“safe”。
其他情况,则输出对应的时间(漏水处的时间为 0)
样例输入:
5 3
..##.
....#
*....
####.
....*
1 5
5 1
4 1
样例输出:
safe
4
#
#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[40][40];
int vis[40][40];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向数组
struct node{
int x,y;
};
node q[10010];//结构体队列
int hh=0,tt=0;
void bfs()
{
while(hh<tt)
{
node ans=q[hh++];
for(int i=0;i<4;i++)
{
int tx=ans.x+dir[i][0];
int ty=ans.y+dir[i][1];
if(tx>=1 && tx<=n && ty>=1 && ty<=n && vis[tx][ty]==-1 && s[tx][ty]!='#')//计算越界+障碍物
{
vis[tx][ty]=vis[ans.x][ans.y]+1;
q[tt++]={tx,ty};
}
}
}
return ;
}
int main(){
cin>>n>>m;
memset(vis,-1,sizeof(vis));//初始化vis=-1
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>s[i][j];
if(s[i][j]=='*')//如果是洪水,直接被淹
{
vis[i][j]=0;
q[tt++]={i,j};
}
else if(s[i][j]=='#')//障碍物标记
{
vis[i][j]=-2;
}
}
}
bfs();//计算
while(m--)
{
int i,j;
cin>>i>>j;
if(vis[i][j]==-2) cout<<"#"<<endl;//障碍
else if(vis[i][j]==-1) cout<<"safe"<<endl;//没有道
else cout<<vis[i][j]<<endl;
}
return 0;
}