1248:Dungeon Master 2021-01-05

1248:Dungeon Master
时间限制: 1000 ms         内存限制: 65536 KB
【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】
多组测试数据。
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】
最小移动次数。
【输入样例】
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
【输出样例】
Escaped in 11 minute(s).
Trapped!
【提示】
对于题目给出数据的含义就是输入l,r,c,分别代表迷宫有l层,每层长宽分别是c,r。对于数据以可以这样移动:
 (1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)->(1,1,5)->(1,2,5)->
 (1,3,5)->(1,3,4)->(1,4,4)->(2,4,4)->(2,4,5)->(3,4,,5)
 共11步就可以到达终点 对于数据二明显不能到达,则输出Trapped!
 这题用BFS解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int s[30][30][30];
int que[100][5];
int c,k,g,i,j,f;
int z[6]={0,0,0,0,-1,1};
int x[6]={-1,1,0,0,0,0};
int y[6]={0,0,-1,1,0,0};
int jz,jx,jy;
bool bl;
char a;
void sca(){
	memset(s,0,sizeof(s));
	for(i=1;i<=g;i++){
		for(j=1;j<=k;j++){
			for(f=1;f<=c;f++){
				cin>>a;
				if(a=='S') {
					s[i][j][f]=1;
					que[1][1]=i;que[1][2]=j;que[1][3]=f;que[1][4]=0;
				}
				else if(a=='E')	{
					s[i][j][f]=0;
					jz=i;jx=j;jy=f;
				}
				else if(a=='#')	s[i][j][f]=1;	
				else if(a=='.') s[i][j][f]=0;
				//printf("%c",a);
			}	
		}
		//printf("\n");
	}		
}
void bfs(){
	bl=false;
	int t=0,w=1;
	do {
		t++;
		for(int i=0;i<6;i++){
			int zz=que[t][1]+z[i];
			int xx=que[t][2]+x[i];
			int yy=que[t][3]+y[i];
			if(zz>0&&zz<=g&&xx>0&&xx<=k&&yy>0&&yy<=c&&s[zz][xx][yy]==0){
				s[zz][xx][yy]=1;
				w++;
				que[w][1]=zz;que[w][2]=xx;que[w][3]=yy;que[w][4]=que[t][4]+1;
				if(zz==jz&&xx==jx&&yy==jy){
					printf("Escaped in %d minute(s).\n",que[w][4]);
					bl=true;break;
				}
				
			}
		}
	}while(w>t&&bl==false);
	if(!bl) printf("Trapped!\n");
}
int main(int argc, char *argv[])
{
	while(1){
		scanf("%d %d %d",&g,&k,&c);
		if(g==0||k==0||c==0) return 0;
		sca();
	 	bfs();
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏阳李老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值