P2360 地下城主
题目大意
背景是逃离地下监狱,也就是三维样例,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格,'.'表示可走,'x'表示墙壁,'S'表示起点,'E'表示终点。每走一小格花费一分钟时间,求逃离地下监狱需要的最少时间。(原题链接:P2360 地下城主)
输入格式:
第一行:表示有多少层,表示一层有多少行,表示一行有多少个
接下来:个矩阵,表示监狱的每一层
输出格式:
一个数:所要花费的最少时间
如果能成功逃离输出:“ ”,否则输出“”
输入样例:
3 4 5
S....
.xxx.
.xx..
xxx.x
xxxxx
xxxxx
xx.xx
xx...
xxxxx
xxxxx
x.xxx
xxxxE
输出样例
Escaped in 11 minute(s).
思路:
这道题明显是使用的,但是知道用平时都是搜索那种两维的,这次是三维的怎么搞,第一想法是压缩成两维,可是真的太抽象了。。。
于是看了一下题解是说直接把数组改成三维就好了嘛,这样看来,这道题好水啊,,,
于是我显示用了三个数组
dx[4] = {-1, 0, 1, 0}
dy[4] = {0, 1, 0, -1}
dz[2] = {-1, 1};
然后我又是这样枚举的
for(int i = 0; i < 4; i++)
for(int i = 0; i < 2; i++)
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[j];
然后就爆零了。。
为什么dist
数组根本没有得到更新,调试了一下,发现,我们一次只能做一个动作(前后上下左右,不能直接右上右下这样走),因此发现了问题,把代码改成了这样。
dx[6] = {-1, 0, 1, 0, 0, 0}
dy[6] = {0, 1, 0, -1, 0, 0}
dz[6] = {0, 0, 0, 0, -1, 1};
for(int i = 0; i < 6; i++)
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];
顺利
第一次做三维,觉得挺典型的 记录一下~
代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 35;
int l, r, c, bx, by, bz, ex, ey, ez; //l是一共几层 r是每层几行 c是每行几个
int dist[N][N][N];
int mp[N][N][N];
int dx[6] = {-1, 0, 1, 0, 0, 0}, dy[6] = {0, 1, 0, -1, 0, 0}, dz[6] = {0, 0, 0, 0, -1, 1};
struct node
{
int x, y, z;
};
void bfs(int sx, int sy, int sz)
{
memset(dist, -1, sizeof dist);
queue<node> q;
node start;
start.x = sx, start.y = sy, start.z = sz;
q.push(start);
dist[sx][sy][sz] = 0;
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 6; i++)
{
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];
if(zz >= 1 && zz <= l && xx >= 1 && xx <= r && yy >= 1 && yy <= c && dist[xx][yy][zz] == -1 && mp[xx][yy][zz] != -1)
{
dist[xx][yy][zz] = dist[t.x][t.y][t.z] + 1;
node p;
p.x = xx, p.y = yy, p.z = zz;
q.push(p);
}
if(mp[xx][yy][zz] == 'E') return;
}
}
}
int main()
{
cin >> l >> r >> c;
for(int z = 1; z <= l; z++)
{
for(int x = 1; x <= r; x++)
{
for(int y = 1; y <= c; y++)
{
char c;
cin >> c;
if(c == 'S') //起点
{
mp[x][y][z] = 2;
bx = x, by = y, bz = z;
}
else if(c == '#') mp[x][y][z] = -1; //障碍
else if(c == '.') mp[x][y][z] = 1; //可走
else if(c == 'E') //终点
{
mp[x][y][z] = 3;
ex = x, ey = y, ez = z;
}
}
}
}
bfs(bx, by, bz);
if(dist[ex][ey][ez] == -1) cout << "Trapped!" << endl;
else cout << "Escaped in " << dist[ex][ey][ez] << " minute(s)." << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端