HDU 1072 Nightmare (BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

题目大意:

走迷宫,初始剩余时间为6min,每步1min;到reset区是若剩余时间大于0,则可以重置。到终点3区,若时间大于0,则成功逃脱。(可以走回路)

0:wall

1:可以走

2:起点

3:终点

4:剩余时间重置为6

源代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 1001
using namespace std;

int go[4][2] = { {-1,0} , {1,0} , {0,-1} , {0,1}};
int s,n,m;

struct node{
    int x,y;
    int pos;
    int time;
    int rest;
}p[maxn*maxn];

int BFS()
{
    //cout<<s<<endl;

    node next;
    queue<node> que;
    que.push(p[s]);
    while(!que.empty())
    {
        for(int i=0;i<4;i++)
        {
            int x=que.front().x+go[i][0];
            int y=que.front().y+go[i][1];

            if(x>0&&x<=n&&y>0&&y<=m&&p[(x-1)*m+y].pos!=0&&que.front().rest>1)
            {   //cout<<p[(x-1)*n+y].pos<<"--->\n";
                if(p[(x-1)*m+y].pos==3)
                    return que.front().time+1;
                else
                {
                    if(p[(x-1)*m+y].pos==4)
                    {
                        next.rest=6;
                        p[(x-1)*m+y].pos=0;
                    }
                    else
                        next.rest=que.front().rest-1;
                    next.time=que.front().time+1;
                    next.x=x;
                    next.y=y;
                    que.push(next);
                }
            }
        }

        que.pop();
    }

    return -1;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int v,num;
        num=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&v);
                p[++num].pos=v;
                p[num].x=i;
                p[num].y=j;
                p[num].time=0;
                p[num].rest=0;
                if(v==2)
                {
                    s=num;
                    p[num].rest=6;
                }
            }
        printf("%d\n",BFS());
    }

    return 0;
}

HDU 1072 Nightmare (BFS)

时间: 2024-10-21 07:14:29

HDU 1072 Nightmare (BFS)的相关文章

HDU 1072 Nightmare(BFS)

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9120    Accepted Submission(s): 4389 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ti

HDU 1072 Nightmare( 身上带有定时炸弹的他能否在炸弹爆炸之前离开—— BFS+DP思想)

Nightmare Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the

HDU 3085 Nightmare Ⅱ (双向广搜)

题意:有M,G两人和鬼魂(Z)在n*m的方格内,M每秒走3步,G每秒走一步,鬼魂每秒走2步,问是否能 不遇到鬼魂下两人相遇,鬼魂可以穿墙(X),人不可以.初始鬼魂有2个. #include<stdio.h> #include<string.h> #include<string> #include<queue> #include<map> #include<iostream> #include<algorithm> #def

HDU 4856 Tunnels(BFS+状压DP)

HDU 4856 Tunnels 题目链接 题意:给定一些管道,然后管道之间走是不用时间的,陆地上有障碍,陆地上走一步花费时间1,求遍历所有管道需要的最短时间,每个管道只能走一次 思路:先BFS预处理出两两管道的距离,然后状态压缩DP求解,dp[s][i]表示状态s,停在管道i时候的最小花费 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using

hdu 1242:Rescue(BFS广搜 + 优先队列)

Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Angel was caught by the MOLIGPY

HDU 1495 非常可乐 (BFS)

 问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:一个瓶子容积s,两个杯子容积分别n,m,并且都没有刻度(不能比对噢!).相互倒水,求平分的他们的最少倒水次数. 思路:暴力搜索吧.并且求最少,(即最优解),所以上BFS: 思考:状态,转移过程,怎么剪纸. 惨痛的debug,我不解释了. 源代码: #include<iostream> #include<cstdio> #include<queue> #

[SCU 4498] RunningPhoton&#39;s Nightmare (BFS预处理+SPFA)

SCU - 4498 给定一张网格图,其中有一些不可到达点和一些时间重置装置 RunningPhoton从起点出发,身上有一个定时炸弹,当时间置0时他就会死 但是在置0前碰到时间重置装置又能重置时间 问 RunningPhoton是否能到达终点 若能,则输出最短时间,若不能,则输出 "Poor RunningPhoton" 这题虽然地图是有 600*600,但是有不超过 150个重置装置 普通 bfs搜的话肯定爆炸,因为你要存每个装置是否被用过了 正确解法如下: 因为我们只关心重置装置

hdu 1072 Nightmare BFS,第一次刷BFS的题,感好牛逼的。。。

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7758    Accepted Submission(s): 3723 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ti

HDU 1072 Nightmare BFS

其实就是多加了一个引爆时间的限制条件,反正n,m给的很小,直接记录3维状态,之后就很随意了. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queue> #include <deque&g