HDU1253 BFS

来源:互联网 发布:2016com域名注册 促销 编辑:程序博客网 时间:2024/05/21 17:02

这一题的陷阱好多啊;

1:出口可能是墙;

2:如果离开的时候魔王恰好回来,输出离开时间而不是 -1;

3:这个条件有些诡异,就是如果迷宫只有一个位置依然输出-1..搞不懂

#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{int x,y,z,t;}node;typedef struct queue{int front,rear;node digit[300000];}queue;int dir[6][3]={0,0,1,0,0,-1,1,0,0,-1,0,0,0,1,0,0,-1,0};int maps[51][51][51];int vis[51][51][51];int n,A,B,C,time;queue s;void init(){s.front = s.rear = 0;}void enqueue(int tx,int ty,int tz,int tt){s.digit[s.rear].x = tx;s.digit[s.rear].y = ty;s.digit[s.rear].z = tz;s.digit[s.rear].t = tt;s.rear++;}void dequeue(){s.front++;}int isempty(){return s.front==s.rear?1:0;}void bfs(int x,int y,int z){node tmp,tx;int i;init();enqueue(0,0,0,0);vis[0][0][0] = 1;s.digit[0].t=0;if(maps[0][0][0]==0&&(A+1)*(B+1)*(C+1)==1){printf("-1\n");return ;}while(!isempty()){tmp.x=s.digit[s.front].x;tmp.y=s.digit[s.front].y;tmp.z=s.digit[s.front].z;tmp.t=s.digit[s.front].t;dequeue();if(tmp.x==A&&tmp.y==B&&tmp.z==C){if(tmp.t>time)printf("-1\n");elseprintf("%d\n",tmp.t);return ;}for(i=0;i<6;i++){tx.x = tmp.x+dir[i][0];tx.y=tmp.y+dir[i][1];tx.z=tmp.z+dir[i][2];if(tx.x>=0&&tx.x<=A&&tx.y>=0&&tx.y<=B&&tx.z>=0&&tx.z<=C)if(!maps[tx.x][tx.y][tx.z]&&!vis[tx.x][tx.y][tx.z]){tx.t = tmp.t + 1;vis[tx.x][tx.y][tx.z]=1;enqueue(tx.x,tx.y,tx.z,tx.t);}}}printf("-1\n");}int main(){int i,j,k;int x,y,z;while(scanf("%d",&n)!=EOF){while(n--){scanf("%d%d%d%d",&x,&y,&z,&time);A=x-1;B=y-1;C=z-1;for(i=0;i<x;i++)for(j=0;j<y;j++)for(k=0;k<z;k++)scanf("%d",&maps[i][j][k]);if(maps[A][B][C]){printf("-1\n");continue;}memset(vis,0,sizeof(vis));bfs(0,0,0);}}return 0;}



原创粉丝点击