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
分析:
我们把毒气和起点同时跑BFS,利用BFS的层序遍历,如果起点可以先到外面,则就可以,具体看代码,一看就懂。
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1000+7;
const int dx[]= {0, 0, -1, 1, -1, -1, 1, 1};
const int dy[]= {-1, 1, 0, 0, -1, 1, -1, 1};
int n,m;
struct Node
{
int x,y;
int step;
int flag;
};
Node a,b;
queue<Node> q;
int ans=1e9;
int vis[N][N],G[N][N];
int bfs()
{
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=0; i<4; i++)
{
int x=dx[i]+a.x;
int y=dy[i]+a.y;
if(x<=n&&x>=1&&y<=n&&y>=1)
{
if(vis[x][y]==0&&G[x][y]!=1)
{
b.x=x;
b.y=y;
b.step=a.step+1;
b.flag=a.flag;
q.push(b);
vis[x][y]=1;
}
}
else
{
if(a.flag==0)
{
ans=a.step+1;
return 0;
}
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
vis[i][j]=0;
}
for(int i=1; i<=n; i++)
{
getchar();
for(int j=1; j<=n; j++)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
G[i][j]=1;
else if(ch=='.')
G[i][j]=0;
else if(ch=='*')
{
G[i][j]=2;
q.push(Node{i,j,0,1});
}
else
{
G[i][j]=3;
q.push(Node{i,j,0,0});
}
}
}
bfs();
if(ans==1e9)
printf("IMPOSSIBLE");
else
printf("%d",ans);
return 0 ;
}