题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1072
题意:给你一个地图,让你在炸弹爆之前找到出口,最初炸弹设定为6,每走一格需要1,中途有地方能让炸弹的时间重置为6,找到出口的最短时间。
题解:直接上BFS,需要注意的是要另开一个数组来存当前位置的炸弹最大时间,如果走回来时炸弹比原来的时间小,就不走。
1 #include<cstdio> 2 #include<queue> 3 using namespace std; 4 int g[10][10],v[10][10],m,n,sx,sy,dir[][2]={1,0,-1,0,0,1,0,-1}; 5 #define FFC(i,a,b) for(int i=a;i<=b;i++) 6 bool check(int x,int y){if(g[x][y]==0||x>n||x<1||y>m||y<1)return 0;return 1;} 7 struct node{int x,y,c,t;}; 8 int fuck(){ 9 node s,now;s.x=sx,s.y=sy,s.c=0,s.t=6,v[sx][sy]=1; 10 queue<node>Q;Q.push(s); 11 while(!Q.empty()){ 12 now=Q.front();Q.pop(); 13 if(!now.t)continue; 14 if(g[now.x][now.y]==3)return now.c; 15 if(g[now.x][now.y]==4)now.t=6; 16 v[now.x][now.y]=now.t; 17 FFC(i,0,3){ 18 int xx=now.x+dir[i][0],yy=now.y+dir[i][1]; 19 if(check(xx,yy)&&now.t-1>v[xx][yy]){ 20 s.x=xx,s.y=yy,s.c=now.c+1,s.t=now.t-1; 21 Q.push(s); 22 } 23 } 24 } 25 return -1; 26 } 27 int main(){ 28 int t,tmp; 29 scanf("%d",&t); 30 while(t--){ 31 scanf("%d%d",&n,&m); 32 FFC(i,1,n)FFC(j,1,m){ 33 scanf("%d",&g[i][j]); 34 v[i][j]=0; 35 if(g[i][j]==2)sx=i,sy=j; 36 } 37 printf("%d ",fuck()); 38 } 39 return 0; 40 }