51NOD--2603 逃出城堡--思维+BFS

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

开始的时候要把毒气和人一块加入队列,然后进行广搜,一开始并不理解为什么这样做。后来想这样才能消除毒气对人的影响,只有这样,他俩才不会走到相同的点。

#include
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;
};
queueq;
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);
    }
}

 

你可能感兴趣的:(ACM广度优先搜索)