标签:hdu
Description
Input
Output
Sample Input
3 3 3 2 1 1 1 1 0 1 1 3 4 8 2 1 1 0 1 1 1 0 1 0 4 1 1 0 4 1 1 0 0 0 0 0 0 1 1 1 1 4 1 1 1 3 5 8 1 2 1 1 1 1 1 4 1 0 0 0 1 0 0 1 1 4 1 0 1 1 0 1 1 0 0 0 0 3 0 1 1 1 4 1 1 1 1 1
Sample Output
4 -1 13
题目大意:
一个人在迷宫里并且身上带有定时炸弹,炸弹经过6秒就会爆炸,在这个迷宫里面有5种属性的方格,2代表出发点,3代表出口,1代表可以走的路,0代表墙,4代表在此点可以把当前的定时炸弹重置为6 . PS:在出口可以出去的条件是定时炸弹剩余时间大于0,同样重置炸弹时间的条件是当前炸弹的爆炸时间大于0.
解题思路:
BFS+DP,当遇到下一步可以带的时间比实际那一步多则更新爆炸时间。.
代码:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; int dirI[4]={1,0,-1,0},is,js,ie,je,n,m; int dirJ[4]={0,1,0,-1},timen[10][10]; struct node{ int i,j,t,v; node(int i0=0,int j0=0,int t0=0,int v0=0){ i=i0,j=j0,t=t0,v=v0; } }a[10][10]; void bfs(){ queue <node> path; timen[is][js]=0; a[is][js].t=6; bool ans=false; path.push(a[is][js]); while(!path.empty()&&!ans){ node s=path.front(); path.pop(); for(int i=0;i<4;i++){ int di=s.i+dirI[i],dj=s.j+dirJ[i]; if(a[di][dj].v==0||di<0||dj<0||di>=n||dj>=m) continue; int temp=timen[s.i][s.j]+1,st=s.t-1 ; if(st>a[di][dj].t||timen[di][dj]==-1){ if(a[di][dj].v==4&&st>=1) {st=6;a[di][dj].t=st;timen[di][dj]=temp;path.push(a[di][dj]);} if(a[di][dj].v==1) {a[di][dj].t=st;timen[di][dj]=temp;path.push(a[di][dj]);} if(a[di][dj].v==3&&st>=1){ans=true;timen[di][dj]=temp;break;} } } } printf("%d\n",timen[ie][je]); } int main(){ int T; scanf("%d",&T); while(T--){ memset(timen,-1,sizeof(timen)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j].v); a[i][j].i=i,a[i][j].j=j,a[i][j].t=0; if(a[i][j].v==2) {is=i,js=j;} if(a[i][j].v==3) {ie=i,je=j;} } } bfs(); } return 0; }
HDU 1072 Nightmare( 身上带有定时炸弹的他能否在炸弹爆炸之前离开—— BFS+DP思想)
标签:hdu
原文地址:http://blog.csdn.net/hush_lei/article/details/38933267