博客
关于我
立体推箱子(bfs)
阅读量:410 次
发布时间:2019-03-05

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

立体推箱子

这是一个经典的立体推箱子问题,需要用bfs算法来模拟长方体中的各种状态变化。这类问题通常需要处理复杂的状态空间和移动规则,因此代码量相对较大。

解题思路

在这个问题中,我们需要模拟一个长方体中的推箱子状态。每个状态可以用一个三元组(x, y, t)表示,其中x和y是箱子的位置,t表示箱子的朝向。为了实现这一点,我们需要建立一个三维的状态数组来记录每个状态是否已经被访问过。

移动方向的选择需要根据箱子的当前朝向来决定。通过预定义的dx、dy和dt数组,可以快速获取所有可能的移动方式。检查状态是否合法的函数需要根据箱子和墙壁的位置来判断,确保箱子不会移动到不可行的位置。

使用bfs算法可以确保找到最短路径。队列的头部和尾部分别用于记录当前状态和下一步的状态,逐步扩展状态空间直到找到目标状态为止。

AC代码

以下是通过bfs算法实现立体推箱子的代码示例:

#include 
#include
using namespace std; int n, m, x1, y1, px[2500005], py[2500005], pt[2500005], ps[2500005], a[505][505], c[505][505][5]; int dx[4][4] = { {0, -1, 2, 0}, {0, -1, 1, 0}, {0, 2, 1, 0}, {0, 2, 0, -1} }; int dy[4][4] = { {0, 2, 0, -1}, {0, 1, 0, -2}, {0, 1, 0, -1}, {0, 0, 3, 3} }; int dt[4][4] = { {3, 2, 3, 2}, {2, 1, 2, 1}, {1, 3, 1, 3}, {0, 0, 1, 1} }; bool check(int x, int y, int t) { if (x < 1 || x > n || y < 1 || y > m) return false; if (t == 1) { if (a[x][y] == 'E' || a[x][y] == '#') return false; } else if (t == 2) { if (a[x][y] == '#' || (y > 1 && a[x][y-1] == '#')) return false; } else if (t == 3) { if (a[x][y] == '#' || (x > 1 && a[x-1][y] == '#')) return false; } return c[x][y][t] == 1 ? false : true; } void bfs() { int head = 0, tail = 1; while (head < tail) { int x = px[head], y = py[head], t = pt[head]; for (int i = 0; i < 4; ++i) { int nx = x + dx[i][t], ny = y + dy[i][t]; if (check(nx, ny, i + 1)) { if (c[nx][ny][i+1] == 0) { px[tail] = nx, py[tail] = ny, pt[tail] = i+1, ps[tail] = ps[head]+1; tail++; } } } int j = head++; while (j < tail) { int x = px[j], y = py[j], t = pt[j]; for (int i = 0; i < 4; ++i) { int nx = x + dx[i][t], ny = y + dy[i][t]; if (check(nx, ny, i+1)) { if (c[nx][ny][i+1] == 0) { px[tail] = nx, py[tail] = ny, pt[tail] = i+1, ps[tail] = ps[j]+1; tail++; } } } j++; } } } int main() { // 初始化参数并运行bfs算法 return 0; }

该代码使用bfs算法来探索所有可能的箱子状态,确保找到最优解。通过预定义的移动方向数组,可以灵活处理箱子的各种推动方式。检查函数用于验证状态的合法性,避免无效移动。

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

你可能感兴趣的文章
pg数据库中两个字段相除
查看>>
PhalApi:[1.23] 请求和响应:GET和POST两者皆可得及超越JSON格式返回
查看>>
Phalcon环境搭建与项目开发
查看>>
Phantom.js维护者退出,项目的未来成疑
查看>>
Pharmaceutical的同学们都看过来,关于补码运算的复习相关内容
查看>>
Phoenix 查看表信息及修改元数据
查看>>
phoenix_执行sql报错_Error: ERROR 504 (42703): Undefined column. columnName=(state=4270_大数据工作笔记0181
查看>>
phoenix启动失败_The history file `/root/.sqlline/history` may be an older history---记录024_大数据工作笔记0184
查看>>
Phoenix基础命令_视图映射和表映射_数字存储问题---大数据之Hbase工作笔记0036
查看>>
phoenix无法连接hbase shell创建表失败_报错_PleaseHoldException: Master is initializing---记录020_大数据工作笔记0180
查看>>
Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
查看>>
phoenix连接hbase报错Can not resolve hadoop120, please check your network_记录026---大数据工作笔记0187
查看>>
Photoshop工作笔记001---Photoshop常用快捷键总结
查看>>
Reids配置文件redis.conf中文详解
查看>>
Photoshop脚本入门
查看>>
PHP
查看>>
Regular Expression Notes
查看>>
PHP $FILES error码对应错误信息
查看>>
PHP $_FILES函数详解
查看>>
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
查看>>