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 ;
}










