HDU 1253 胜利大逃亡
很简单的BFS,居然花了我一个下午。。。。多亏了pork,十分感谢,学习了不少东西
占用内存大的队列别开在局部函数里面,直接扔到全局里面
#include<stdio.h> #include<string.h> #define Max 125000 typedef struct { int x,y,z; }position; typedef struct { int head,tail; position a[Max]; }queue; queue q; void create(queue&); void enqueue(position ,queue&); position dequeue(queue&); int empty(queue&); int bfs(int ,int ,int); int maze[51][51][51]; int visited[51][51][51]; position move[6]={1,0,0,-1,0,0,0,-1,0,0,1,0,0,0,1,0,0,-1}; int main() { int l,r,c,i,j,k,time,arrival,n; for(scanf("%d",&n);n;n--) { memset(visited,0,sizeof(visited)); scanf("%d %d %d %d",&l,&r,&c,&time); for(i=1;i<=l;i++) for(j=1;j<=r;j++) for(k=1;k<=c;k++) scanf("%d",&maze[i][j][k]); if(l+r+c-3>time) { printf("-1\n"); continue; } if(maze[l][r][c]==1) { printf("-1\n"); continue; } arrival=bfs(l,r,c); /* printf("-----------------\n"); for(i=1;i<=l;i++) { for(j=1;j<=r;j++) { for(k=1;k<=c;k++) printf("%d ",visited[i][j][k]); putchar('\n'); } printf("\n\n\n"); }*/ if(arrival<=time) printf("%d\n",arrival); else printf("-1\n"); } return 0; } int bfs(int l,int r,int c) { int i; position now,next; create(q); now.x=now.y=now.z=1; enqueue(now,q); while(!empty(q)) { now=dequeue(q); for(i=0;i<6;i++) { next.x=now.x+move[i].x; next.y=now.y+move[i].y; next.z=now.z+move[i].z; if(next.z==l&&next.x==r&&next.y==c) return visited[now.z][now.x][now.y]+1; if(!visited[next.z][next.x][next.y]&&maze[next.z][next.x][next.y]==0&&next.z<=l&&next.x<=r&&next.y<=c&&next.z>=1&&next.x>=1&&next.y>=1) { visited[next.z][next.x][next.y]=visited[now.z][now.x][now.y]+1; enqueue(next,q); } } } return 1000000000; } void create(queue&q) { q.head=q.tail=0; } void enqueue(position p,queue&q) { q.a[q.tail]=p; q.tail=(q.tail+1)%Max; } position dequeue(queue&q) { position p; p=q.a[q.head]; q.head=(q.head+1)%Max; return p; } int empty(queue &q) { if(q.head==q.tail) return 1; else return 0; }