题目链接: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; }