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;
}
浙公网安备 33010602011771号