hdu 1072 Nightmare bfs 重置定时炸弹

来源:互联网 发布:网络语言bug什么意思 编辑:程序博客网 时间:2024/05/22 16:54

题意:

一个人被绑上定时炸弹后关入n*m迷宫,炸弹倒计时时6s,人只能走上下左右四个方向,每次耗时1秒,走出迷宫可抛掉炸弹获救。迷宫存在5种元素:

0,表示墙,不能通行

1,表示路,可以通行

2,表示起点

3,表示出口

4,表示定时炸弹重置器,即炸弹计时变回6s,重置耗时不计。

注意:在到达出口或者重置位置时,如果倒计时为0,则回被炸死,即每次重置只有5s移动时间。

球逃出迷宫的最短时间,若逃不出去则输出-1。


题解:

典型的bfs题目,用key更新状态(key+1),每次碰到重置器后更新,即变为从重启器地点开始新一轮的bfs。将到达的重启器地点设置为墙(因为不可能回去,如果回去了就说明不能逃出去,那么回到重置器位置也就没有意义)。





代码:

#include <iostream>#include <queue>#include <cstdio>#include <cstring>#include <algorithm>#include <ctime>#include <vector>#include <cmath>#include <cstdlib>using namespace std;struct node{    int x,y,num,t;    int key;};int vis[64][10][10];int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int e[10][10];void bfs(int x1,int y1,int x2,int y2,int n,int m){    int i,j,k;    memset(vis,0,sizeof(vis));    vis[0][x1][y1]=1;    node f,g;    f.x=x1,f.y=y1,f.num=0,f.key=0,f.t=0;    queue<node>q;    q.push(f);    while(!q.empty())    {        f=q.front();        q.pop();        for(i=0;i<4;i++)        {            g.x=f.x+dir[i][0];            g.y=f.y+dir[i][1];            if(g.x<0||g.y<0||g.x>=n||g.y>=m||e[g.x][g.y]==0||vis[f.key][g.x][g.y])continue;            g.num=f.num+1;            g.t=f.t+1;            //if(g.x==3&&g.y==3)printf("%d\n",g.t);            if(g.x==x2&&g.y==y2){printf("%d\n",g.num);return ;}            if(e[g.x][g.y]==4)            {                g.t=0;                g.key=f.key+1;                e[g.x][g.y]=0;                vis[g.key][g.x][g.y]=1;            }            else            {                if(g.t==5)continue;                g.key=f.key;                vis[g.key][g.x][g.y]=1;            }            q.push(g);        }    }    printf("-1\n");}int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n,m,i,j,k,x1,y1,x2,y2;        scanf("%d%d",&n,&m);        for(i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                scanf("%d",&e[i][j]);                if(e[i][j]==2)x1=i,y1=j;                if(e[i][j]==3)x2=i,y2=j;            }        }        bfs(x1,y1,x2,y2,n,m);    }    return 0;}


0 0
原创粉丝点击