社区讨论

站外题求调(悬关)

学术版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo3b4bnc
此快照首次捕获于
2023/10/24 03:44
2 年前
此快照最后确认于
2023/10/24 03:44
2 年前
查看原帖
CPP
题目描述
你被困在一个3D地牢中,需要找到最快的出路!地牢是由单位立方体组成的,可能有或不可能充满岩石。把一个单位向北、南、东、西、上或下移动一分钟。你不能斜向移动,迷宫四周都是坚硬的岩石。

逃生是可能的吗?如果是的话,要花多长时间?

输入格式
地牢描述从一个包含三个整数L,R和C(所有限制为30的大小)开始。

L是构成地牢的层级数。

R和C是构成每个层次的计划的行和列的数目。

然后将遵循R块的每行包含C字符。每个角色都描述了地牢中的一个格子。一个充满岩石的格子是由一个'y'表示的,空的格子由一个'.'表示。你的起始位置用“S”表示,而字母“E”的出口表示。每个级别后有一条空行。

输出格式
迷宫产生一行输出。如果有可能到达出口,输出最小的x,表示在x分钟(S)中逃逸。

如果无法逃脱,输出Trapped!
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int dx[6]={1,-1,0,0,0,0},dy[6]={0,0,1,-1,0,0},dz[6]={0,0,0,0,1,-1},vis[31][31][31],r,c,l;
char g[31][31][31];
struct data{
	int x,y,z,dis;
}st;
bool operator<(data a,data b)
{
	return a.dis>b.dis;
}
void bfs()
{
	priority_queue<data>q;
	q.push({st.x,st.y,st.z,st.dis});
	while(q.size())
	{
		data t=q.top();
		q.pop();
		for(int i=0;i<6;i++)
		{
			int x=t.x+dx[i],y=t.y+dy[i],z=t.z+dz[i];
			if(x<0||x>=r)continue;
			if(y<0||y>=c)continue;
			if(z<0||z>=l)continue;
			if(vis[x][y][z])continue;
			if(g[x][y][z]=='#')continue;
			if(g[x][y][z]=='E')
			{
				printf("%d",t.dis+1);
				return;
			}
			vis[x][y][z]=1;
			q.push({x,y,z,t.dis+1});
		}
	}
	cout<<"Trapped!";
}
int main(){
	scanf("%d%d%d",&l,&r,&c);
	for(int i=0;i<l;i++)
	{
		for(int j=0;j<r;j++)
		{
			for(int k=0;k<c;k++)
			{
				cin>>g[j][k][i];
				if(g[j][k][i]=='S')st.x=j,st.y=k,st.z=i,st.dis=0;
			}
		}
	}
	bfs();
}
50分WA求调

回复

1 条回复,欢迎继续交流。

正在加载回复...