hrbust1444 逃脱 【BFS】

Description

 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境?

幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:

“.”:表示这是一块空地,是可以随意穿梭的。

“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。

“S”:表示mengxiang000和Tabris所在位子。

“E”:表示幼儿园的出口。

“*”表示火灾发源地(保证输入只有一个火灾发源地)。

已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)

根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。

Input

第一行输入一个整数t,表示一共的测试数据组数。

第二行输入两个整数n,m,表示幼儿园的大小。

接下来n行,每行m个字符,表示此格子是什么元素。

t<=200

3<=n<=30

3<=M<=30

保证图中有一个起点,一个出口,一个火灾源处.

Output

每组数据输出一行,如果两人能够成功到达出口,那么输出最短逃离时间,否则输出T_T

Sample Input

35 5*...........S#....E......5 5...#*..#S#...##....E.....5 5.....S......*#....E......

Sample Output

2T_TT_T

HINT

 为了防止孩子们嬉戏中受伤,墙体是橡胶制作的,可以燃烧的哦。

Source


思路:

一开始想的是。。。走的时候考虑火已经蔓延。。。我也不知道为什么这么考虑,然后大哥说可能他第一步就直接到达了= =、是啊,所以不能这么考虑啊,还是人先走,然后火后走,BFS就是那么按部就班,感觉真是蠢哭,只要能走到就进队,然后在出队的时候判断一下是不是已经走到了。

然后wa到怀疑人生啊!!!卧槽!!!卧槽!!!因为我天真的判断了一下出队的火的蔓延,然后入队那边火的蔓延没有判断。。。。

这题BFS是:

1.搜索一定是按部就班的!

2.搜索你踏马的判断条件,各种限制都不能省啊

哎。。。贴一发代码;

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=50;

int huo[N][N];
char ma[N][N];
int n,m;
int sx,sy;
int ex,ey;
struct asd{
    int x,y;
    int step;
};
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};

void BFS()
{
    bool vis[N][N];
    queue<asd>q;
    memset(vis,0,sizeof(vis));
    asd now,next;
    now.x=sx;
    now.y=sy;
    now.step=0;
    vis[sx][sy]=1;

    q.push(now);

    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x==ex&&now.y==ey)    //出队的时候先考虑是不是到了,然后考虑烧到了没
        {
            printf("%d
",now.step);
            return;
        }
        if(huo[now.x][now.y]<=now.step)
            continue;
        for(int i=0;i<4;++i)
        {
            int x=now.x+dx[i];
            int y=now.y+dy[i];
            if(x<0||y<0||x>=n||y>=m||vis[x][y]||ma[x][y]=='#'||huo[x][y]<now.step+1)//就是这里!!!
                continue;
            vis[x][y]=1;
            next.step=now.step+1;
            next.x=x;
            next.y=y;
            q.push(next);
        }
    }
    puts("T_T");
}

void DEBUG()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            printf("%3d",huo[i][j]);
        puts("");
    }
}

void init_huo()
{
    memset(huo,-1,sizeof(huo));
    int flag=0;
    int x,y;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(ma[i][j]=='*')
            {
                flag=1;
                x=i;
                y=j;
                huo[i][j]=0;
                break;
            }
        }
        if(flag) break;
    }
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<m;j++)
        {
            if(huo[i][j]==-1)
                huo[i][j]=max(abs(i-x),abs(j-y));
        }
    }
    //DEBUG();
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%s",ma[i]);
        int flag=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(ma[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                    flag+=1;
                }
                if(ma[i][j]=='E')
                {
                    ex=i;
                    ey=j;
                    flag+=1;
                }
                if(flag==2) break;
            }
            if(flag==2) break;
        }
        init_huo();
        BFS();
    }
    return 0;
}
/*

5 5
*....
.S...
...#.
.....
....E
5 5
*..E.
.....
..S#.
.....
.....
5 5
*....
.....
..S#.
..#E.
.....
5 5
#....
.....
..S*.
..E..
.....
5 5
#....
..S..
E..*.
.....
.....



*/




原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777531.html