标签:
2 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
4 -1
题意是:起点为2终点为3 炸弹会在6分钟内爆炸(当刚好走出迷宫剩余时间为0也会爆炸) 必须在炸弹爆炸之前走出迷宫
当遇到4时时间可以重置为6 当走到4时剩下时间为0则不能重置时间,如果可以在规定时间内走出迷宫则输出走的步数
否则输出-1
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> #define MAX 10 using namespace std; int map[MAX][MAX]; int vis[MAX][MAX]; int n,m,t,sum; int x1,x2,y1,y2; struct node { int x,y; int step,time; friend bool operator < (node a,node b) { return a.step>b.step; } }; void bfs() { int move[4][2]={0,1,0,-1,1,0,-1,0}; int i,j; priority_queue<node>q; node beg,end; beg.x=x1; beg.y=y1; beg.step=0; beg.time=6;//用来记录在遇到可以重置时间(4)之前走了多少步 q.push(beg); vis[x1][y1]=1; while(!q.empty()) { end=q.top(); q.pop(); if(end.x==x2&&end.y==y2) { printf("%d\n",end.step); return ; } if(end.time==1)//判断当剩下一步的时候是否到达终点(因为当剩下0步时即使是 //到了可以重置时间的地方也没用) continue; for(i=0;i<4;i++) { beg.x=end.x+move[i][0]; beg.y=end.y+move[i][1]; if(0<=beg.x&&beg.x<n&&0<=beg.y&&beg.y<m&&map[beg.x][beg.y]!=0) { if(map[beg.x][beg.y]==4)//当遇到4 { beg.time=6;//步数时间重新变为6 map[beg.x][beg.y]=0; } else beg.time=end.time-1;//否则 走一步时间减1 beg.step=end.step+1; q.push(beg); } } } printf("-1\n"); } int main() { int i,j,k,s; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%d",&map[i][j]); } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(map[i][j]==2) { x1=i;y1=j; } if(map[i][j]==3) { x2=i;y2=j; } } } sum=0; memset(vis,0,sizeof(vis)); bfs(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4631626.html