博客
关于我
POJ2251
阅读量:794 次
发布时间:2023-03-03

本文共 2857 字,大约阅读时间需要 9 分钟。

这道题目是一个3D迷宫问题,要求从起点S出发,找到终点E,并计算最少需要多少分钟。传统的BFS方法可能会超时,但通过使用分层DFS,可以有效地解决问题。

DFS思路

DFS在处理3D迷宫时,可以通过将问题分解到各个维度来解决。具体来说,从起点开始,尝试所有可能的方向。如果当前层无法找到终点,则进入下一层,继续搜索。这类似于在二维迷宫中使用层序遍历的思路。

代码实现

#include 
#include
#include
#include
using namespace std;int L, R, C;const int MAX_SIZE = 30;int g[MAX_SIZE][MAX_SIZE][MAX_SIZE];int vis[MAX_SIZE][MAX_SIZE][MAX_SIZE];int star[3];int endd[3];int mov_row[4] = {-1, 0, 0, 1};int mov_col[4] = {0, -1, 1, 0};int ans = 0;bool flag = false;void DFS(int level, int row, int col) { if (level == endd[0] && row == endd[1] && col == endd[2]) { printf("Escaped in %d minute(s).\n", ans); flag = true; return; } if (level == L) { return; } for (int i = 0; i < 4; ++i) { int x = row + mov_row[i]; int y = col + mov_col[i]; if (x >= 0 && x < R && y >= 0 && y < C) { if (vis[level][x][y] == 0 && g[level][x][y] == 0 && g[level][x][y] != 2 && !flag) { vis[level][x][y] = 1; ans += 1; DFS(level, x, y); ans -= 1; vis[level][x][y] = 0; } } } if (!flag) { vis[level + 1][row][col] = 1; ans += 1; DFS(level + 1, row, col); ans -= 1; vis[level + 1][row][col] = 0; }}int main() { freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); char c; while (cin >> L >> R >> C && L && R && C) { if (L == R && R == C && C == 0) { break; } ans = 0; flag = false; memset(g, 0, sizeof(g)); memset(vis, 0, sizeof(vis)); for (int i = 0; i < L; ++i) { for (int j = 0; j < R; ++j) { for (int k = 0; k < C; ++k) { cin >> c; if (c == 'S') { g[i][j][k] = -1; star[0] = i; star[1] = j; star[2] = k; } else if (c == '.') { g[i][j][k] = 0; } else if (c == '#') { g[i][j][k] = 1; } else if (c == 'E') { g[i][j][k] = 2; endd[0] = i; endd[1] = j; endd[2] = k; } } if (i < L - 1) { getchar(); } } } vis[star[0]][star[1]][star[2]] = 1; DFS(star[0], star[1], star[2]); if (!flag) { printf("Trapped!\n"); } } return 0;}

改进点

  • 避免递归深度过深:使用迭代的方式进行DFS,避免了传统递归的栈溢出问题。
  • 分层搜索:在每一层中进行DFS,处理完当前层的节点后,进入下一层,确保每一层的节点独立处理。
  • 正确计算步数:使用非递归的方式,确保每次访问节点时,步数被正确计算,并在回溯时恢复。
  • 优化访问标记:使用vis数组记录当前层的访问情况,避免重复处理同一节点,提高效率。
  • 通过上述优化,DFS在处理3D迷宫时能够高效地找到路径,避免超时问题。

    转载地址:http://pdxfk.baihongyu.com/

    你可能感兴趣的文章
    php当前时间的集中写法
    查看>>
    php循环比较数组中的值,如何从PHP数组中计算值并在foreach循环中仅显示一次值?...
    查看>>
    php微信 开发笔记,微信WebApp开发总结笔记
    查看>>
    php怎么将对象变成数组,php怎么将对象转换成数组
    查看>>
    PHP性能监控 - 怎么看xhprof报告(二)
    查看>>
    php操作mysql用select_php如何操作mysql获取select 结果
    查看>>
    PHP操作符与控制结构
    查看>>
    php支付宝手机网页支付类实例
    查看>>
    PHP数据访问的多重查询(租房子查询)
    查看>>
    php数组函数分析--array_column
    查看>>
    php数组实现:哈希 +双向链表
    查看>>
    PHP数组排序函数array_multisort()函数详解(二)
    查看>>
    php数组的几个函数和超全局变量
    查看>>
    PHP文件锁
    查看>>
    php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
    查看>>
    PHP时间戳和日期相互转换操作总结
    查看>>
    php时间戳知识点,php 时间戳函数总结与示例
    查看>>
    PHP查找数组中最大值与最小值
    查看>>
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>