• 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..*.
    .....
    .....
    
    
    
    */




  • 相关阅读:
    .NET Core中如何对Url进行编码和解码
    How to signout from an Azure Application?(转载)
    2016阿里安全峰会重点资料下载
    只有程序员才看懂的内涵图
    2016乌云白帽资料下载
    Python黑帽编程2.1 Python编程哲学
    Python黑帽编程2.2 数值类型
    Python黑帽编程 2.0 第二章概述
    PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
    乌云挂了,知识库的文章却在流传
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777531.html
Copyright © 2020-2023  润新知