首页 > 代码库 > Dungeon Master UVA 532 (三维空间的广度优先遍历)

Dungeon Master UVA 532 (三维空间的广度优先遍历)

说说:

其实这道题就是一道广度优先遍历求最短路径的简单题目。但是可能今晚状态不太好,开始一直想当然地就按深度优先遍历去写了。然后测试数据又刚好能通过,结果就特别地纠结。不过总的来说,这道题是非常简单的。至于代码的话,后来写得烦起来了,可能看起来有点凌乱QAQ

源代码:

#include <stdio.h>
#include <string.h>
#define MAX 30+5

typedef struct{
  int x;
  int y;
  int z;
  int dis;
}NODE;

NODE queue[28000];//队列
char dungeon[MAX][MAX][MAX];
int vis[MAX][MAX][MAX];//记录最短路径
int L,R,C,ans;
int ex,ey,ez;
int head,tail;

void bfs();
void inqueue(int,int,int);//将某个节点入队

int main(){
  int i,j,k;
//  freopen("data","r",stdin);
  while(scanf("%d%d%d",&L,&R,&C)){
    if(!L&&!R&&!C)
      break;
    memset(vis,0,sizeof(vis));
    tail=head=ans=0;
    for(i=0;i<L;i++)
      for(j=0;j<R;j++)
        scanf("%s",dungeon[i][j]);
    
    for(i=0;i<L;i++)
      for(j=0;j<R;j++)
        for(k=0;k<C;k++)
	  if(dungeon[i][j][k]=='E'){//找到出口
            ex=i;
	    ey=j;
	    ez=k;
	  }
	  
    for(i=0;i<L;i++)
      for(j=0;j<R;j++)
        for(k=0;k<C;k++)
	   if(dungeon[i][j][k]=='S'){
	     vis[i][j][k]=1;
	     queue[tail].x=i;
	     queue[tail].y=j;
	     queue[tail].z=k;
	     queue[tail].dis=1;
	     tail++;
	     while(head<tail)
	     bfs();
	    }

    if(ans)
      printf("Escaped in %d minute(s).\n",vis[ex][ey][ez]-1);
    else 
      printf("Trapped!\n");
  }

  return 0;
}

void bfs(){
  int x,y,z;
  x=queue[head].x;
  y=queue[head].y;
  z=queue[head].z;
  if(x==ex&&y==ey&&z==ez)
    ans=1;
  if(z-1>=0&&dungeon[x][y][z-1]!='#'&&!vis[x][y][z-1])//注意边界条件,较为繁琐
    inqueue(x,y,z-1);
  if(z+1<C&&dungeon[x][y][z+1]!='#'&&!vis[x][y][z+1])
    inqueue(x,y,z+1);
  if(y-1>=0&&dungeon[x][y-1][z]!='#'&&!vis[x][y-1][z])
    inqueue(x,y-1,z);
  if(y+1<R&&dungeon[x][y+1][z]!='#'&&!vis[x][y+1][z])
    inqueue(x,y+1,z);
  if(x-1>=0&&dungeon[x-1][y][z]!='#'&&!vis[x-1][y][z])
    inqueue(x-1,y,z);
  if(x+1<L&&dungeon[x+1][y][z]!='#'&&!vis[x+1][y][z])
    inqueue(x+1,y,z);
  
  head++;
  return;
}

void inqueue(int x,int y,int z){
  queue[tail].x=x;
  queue[tail].y=y;
  queue[tail].z=z;
  queue[tail].dis=vis[x][y][z]=queue[head].dis+1;
  tail++;
}


Dungeon Master UVA 532 (三维空间的广度优先遍历)