poj2251

13 篇文章 0 订阅

       这道题目首先题意不好理解,我折腾了个把小时才弄懂题目的意思(不是英语不好),发现最重要的信息就是三维空间(3D dungeon),有L层,每层的结构为R*C的矩阵,这样就组成了一个三维的矩阵。其次,这个题目适合用广搜,凡是涉及到最短路的题目一般都用广搜,除非广搜不行,在考虑深搜。例如poj3009,这题也是求最少的移动次数,但不能用广搜,因为它的每一步都会使得状态改变。弄懂了题意后就是一道广搜水题了,注意这里每个节点有6个方向可以行进(三维空间嘛),用三维数组模拟maze,就可以很轻松的解决这题。另外这里还要注意一个小问题,以后设置全局变量尽量不要用count取名,不知道为什么count似乎与标准库中的保留字或其他东西相关,因此总是报错。试过很多次,都是这样的。经验之谈。下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
#define Max 50
bool maze[Max][Max][Max];
bool flag[Max][Max][Max];
int dir,h,w;
typedef struct Node{
	int x;
	int y;
	int dir;
	int deep;
}node;
int sx,sy,sdir,ex,ey,edir;
int Count;
bool bfs(){
	queue<node> Que;
	node point;
	point.x=sx;
	point.y=sy;
	point.dir=sdir;
	point.deep=0;
    Que.push(point);
	flag[sdir][sx][sy]=1;
	int x,y,bdir,bdeep;
	while(!Que.empty()){
		point=Que.front();
	    Que.pop();
		x=point.x,y=point.y;
		bdir=point.dir,bdeep=point.deep;
		if(x==ex && y==ey && bdir==edir){
			Count=bdeep;
			return true;
		}
		if(y-1>=1 && maze[bdir][x][y-1] && !flag[bdir][x][y-1]){
			point.x=x;
			point.y=y-1;
			point.dir=bdir;
			point.deep=bdeep+1;
			flag[bdir][x][y-1]=1;
			Que.push(point);
		}
		if(y+1<=w && maze[bdir][x][y+1] && !flag[bdir][x][y+1]){
			point.x=x;
			point.y=y+1;
			point.dir=bdir;
			point.deep=bdeep+1;
			flag[bdir][x][y+1]=1;
			Que.push(point);
		}
		if(x-1>=1 && maze[bdir][x-1][y] && !flag[bdir][x-1][y]){
			point.x=x-1;
			point.y=y;
			point.dir=bdir;
			point.deep=bdeep+1;
			flag[bdir][x-1][y]=1;
			Que.push(point);
		}
	    if(x+1<=h && maze[bdir][x+1][y] && !flag[bdir][x+1][y]){
			point.x=x+1;
			point.y=y;
			point.dir=bdir;
			point.deep=bdeep+1;
			flag[bdir][x+1][y]=1;
			Que.push(point);
		}
		if(bdir-1>=1 && maze[bdir-1][x][y] && !flag[bdir-1][x][y]){
			point.x=x;
			point.y=y;
			point.dir=bdir-1;
			point.deep=bdeep+1;
			flag[bdir-1][x][y]=1;
			Que.push(point);
		}
		if(bdir+1<=dir && maze[bdir+1][x][y] && !flag[bdir+1][x][y]){
			point.x=x;
			point.y=y;
			point.dir=bdir+1;
			point.deep=bdeep+1;
			flag[bdir+1][x][y]=1;
			Que.push(point);
		}
	}
	return false;
}

int main(){
	while(scanf("%d%d%d",&dir,&h,&w),dir){
		memset(maze,0,sizeof(maze));
		memset(flag,0,sizeof(flag));
		char str;
	    for(int i=1;i<=dir;i++){
			getchar();
			for(int j=1;j<=h;j++){
				for(int k=1;k<=w;k++){
					str=getchar();
					if(str=='.')
						maze[i][j][k]=1;
					else if(str=='S'){
					    sdir=i;
						sx=j;
						sy=k;
						maze[i][j][k]=1;
					}
					else if(str=='E'){
						edir=i;
						ex=j;
						ey=k;
						maze[i][j][k]=1;
					}
				}
				getchar();
			}
		}
		if(bfs())
			printf("Escaped in %d minute(s).\n",Count);
		else
			printf("Trapped!\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值