51NOD 2603 逃出城堡 (BFS巧妙)

泠之屋

关注

阅读 22

2023-04-04


2603 逃出城堡

  1. 1.0 秒
  2.  
  3. 131,072.0 KB
  4.  
  5. 20 分
  6.  
  7. 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 ;
}

 

精彩评论(0)

0 0 举报