哈理工OJ 2035 Diablo(多次广度优先搜索+详解)

Diablo
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 50(25 users) Total Accepted: 28(24 users) Rating: Special Judge: No
Description
哈理工OJ 2035 Diablo(多次广度优先搜索+详解)_第1张图片

Diablo是地狱中的三大魔王之一,有着非常强大的破坏力,Diablo期望着可以将一切都投入到地狱之中。为了不让Diablo的计划得逞,一位英雄决定挺身而出,试图击败Diablo。DIablo喜欢把眼前的区域变成一片火海,Diablo吐出火焰的蔓延是有一定规律的,火焰总是会向能量较低的区域蔓延。英雄如果不想被Diablo击败的话,就需要在Diablo喷出火焰的一瞬间逃到火焰烧不到的地方,但是他只能在这一瞬逃出3个单位长度的距离。现在我们给出现场的一个地图,并且给出Diablo和英雄所在的位置,我们要知道英雄是否可以逃脱Diablo的攻击。(火焰蔓延方向只能是上、下、左、右)

Input
本题有多组测试数据,对于每组数据第一行输入6个非负整数,分别表示地图的长、宽(分别对应m、n),Diablo的坐标以及英雄的坐标。接下来n行每行输入m个数,表示地图上每个点的能量值(值在32位有符号整数范围内)。m、n值均不大于100,且我们保证数据合理合法。
Output
如果英雄可以逃脱Diablo的攻击,输出Hero will be back并换行,否则输出Diablo win并换行。
Sample Input
3 3 0 0 2 2
5 4 1
4 3 2
3 2 1

6 4 0 0 2 3
5 2 6 7 3 0
4 3 8 1 5 5
9 1 8 3 6 5
8 7 6 5 4 2

Sample Output
Diablo win

Hero will be back

Hint
我们来看看第二组样例数据,Diablo所处的位置是(0, 0),那么Diablo在地图上左上角的点,其能量值为5。英雄所在的位置是(2, 3),也就是我们看到地图上第三行第四列的位置,其能量值为3。不过火焰只能从能量高的地方向能量低的地方蔓延,尽管英雄处在的位置能量值较低,但是火焰却无法蔓延到这里,因为有能量相对较高的地势阻隔。假设英雄所在的位置能被火焰蔓延到,他只需在3步内找到一个火焰不可达的合法区域即可躲过攻击。

本题的题意就不多做解释了,说一下大致的思路吧:先从魔王出开始搜索,找到所有火焰可以走到的地方,然后把能走到的地方都标记上,然后开始从英雄处搜索,看能不能在规定的时间内找到一个未被标记的点,如果这个点存在,那么英雄可以返回,如果这个点不存在,那么魔王取得胜利。

具体实现看代码;
下面是AC代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;

struct node
{
    int x,y,step;
};
int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int n,m,dx,dy,zx,zy;
int a[105][105],book[105][105],visit[105][105];
void bfs(int sx,int sy)
{
    book[sx][sy]=1;
    queue<node>q;
    node fr,ne;
    fr.x=sx,fr.y=sy;
    q.push(fr);
    while(!q.empty())
    {
        fr=q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            ne.x=fr.x+dir[i][0];
            ne.y=fr.y+dir[i][1];
            if(ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<m&&book[ne.x][ne.y]==0&&a[ne.x][ne.y]<a[fr.x][fr.y])
            {
                book[ne.x][ne.y]=1;
                q.push(ne);
            }
        }
    }
}

int bfs2(int sx,int sy)
{
    node fr,ne;
    fr.x=sx;
    fr.y=sy;
    visit[fr.x][fr.y]=1;
    fr.step=0;
    queue<node>q;
    q.push(fr);
    while(!q.empty())
    {
        fr=q.front();
        q.pop();
        if(book[fr.x][fr.y]==0&&fr.step<=3)
        {
            return 1;
        }
        for(int i=0; i<4; i++)
        {
            ne.x=fr.x+dir[i][0];
            ne.y=fr.y+dir[i][1];
            ne.step=fr.step+1;
            if(ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<m&&visit[ne.x][ne.y]==0&&ne.step<=3)
            {
                visit[ne.x][ne.y]=1;
                q.push(ne);
            }
        }
    }
    return 0;
}
int main()
{
    while(~scanf("%d%d%d%d%d%d",&n,&m,&dx,&dy,&zx,&zy))
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        memset(book,0,sizeof(book));
        bfs(dx,dy);
        memset(visit,0,sizeof(visit));
        int re=bfs2(zx,zy);
        if(re==1)
        {
            printf("Hero will be back\n");
        }
        else printf("Diablo win\n");
    }
    return 0;
}

你可能感兴趣的:(哈理工oj)