梦,才是最真的现实

导航

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;
}


posted on 2012-05-31 16:48  梦,才是最真的现实  阅读(90)  评论(0编辑  收藏  举报