2603 逃出城堡
- 1.0 秒
- 131,072.0 KB
- 20 分
- 3级题
小Biu被困在一个城堡中,城堡可以看成一个大小为n*n的二维平面上的网格图,每一个格子要么为平地,要么为墙壁,要么为毒区,而且作为毒区的格子,每一秒会向他周围的上下左右四个格子扩散毒气(毒气不能穿过墙壁)。现在小Biu身负重任,最开始小Biu在某一个平地上,他每一秒可以向他上下左右四个格子中的作为平地的格子移动一步,他想知道如果不能穿越墙壁,也不能接触有毒气的格子(如果毒气和小Biu同时到达某个平地,也算接触),他最少需要多长时间才能逃出城堡,只要从任何一个边缘走出城堡都算逃出城堡。
如图所示的数据中,只要小Biu先向右移动两步,再向下移动两步,即可逃出城,所以答案为4。
收起
输入
第1行:一个整数n,表示城堡的大小是一个n*n的网格图。(1<=n<=1000) 第2-n+1行:每一行有n个字符,'.'表示平地,'*'表示有毒气的格子,'#'表示墙壁,'S'表示小Biu最开始的位置。
输出
输出一个整数表示答案,如果小Biu不能逃出城堡则输出"IMPOSSIBLE"(不带引号)。
输入样例
5 .*... ....# .*..# #S..# .##.#
输出样例
4
开始的时候要把毒气和人一块加入队列,然后进行广搜,一开始并不理解为什么这样做。后来想这样才能消除毒气对人的影响,只有这样,他俩才不会走到相同的点。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=100+66;
const ll mod=1e9+7;
int bx,by;
int fx[9]= {-1,1,0,0,0,1,1,1};
int fy[9]= {0,0,-1,1,1,1,0,-1};
int vis[1003][1003];
struct node
{
int x;
int y;
int step;
int flag;
};
queue<node>q;
int n;
int ans;
void bfs()
{
while(!q.empty())
{
int x=q.front().x;
int y=q.front().y;
int step=q.front().step;
int flag=q.front().flag;
q.pop();
for(int i=0; i<4; i++)
{
int x1=x+fx[i];
int y1=y+fy[i];
if(x1<1||x1>n||y1<1||y1>n)
{
if(flag)
{
ans=step+1;
return;
}
else
{
continue;
}
}
if(vis[x1][y1])continue;
vis[x1][y1]=1;
q.push(node{x1,y1,step+1,flag});
}
}
return ;
}
int main()
{
ans=9999999;
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char c;
scanf("%c",&c);
if(c=='#')
{
vis[i][j]=1;
}
else if(c=='*')
{
q.push(node{i,j,0,0});
}else if(c=='S')
{
q.push(node{i,j,0,1});
}
}
getchar();//读入换行
}
bfs();
if(ans==9999999)
{
printf("IMPOSSIBLE\n");
}else
{
printf("%d\n",ans);
}
}
403

被折叠的 条评论
为什么被折叠?



