棋盘场景下矩形长方体滚动最短路径求解算法咨询
适配长方体翻转场景的最短路径算法方案

核心算法选型
这个场景属于无权最短路径搜索,直接用标准的BFS(广度优先搜索)即可适配,核心是要将长方体的姿态纳入搜索节点的定义,不能仅用坐标作为状态标识。
状态定义规则
你需要把长方体的所有可能状态用三元组唯一表示,避免重复搜索:
- 直立状态(占用1个棋盘格):
(x, y, 0),其中x、y为被占用格子的坐标,0为直立状态标识 - 横向横置状态(水平占用左右2个棋盘格):
(x, y, 1),其中x、y为左侧被占用格子的坐标,实际占用(x,y)、(x+1,y)两个格子,1为横向横置标识 - 纵向横置状态(垂直占用上下2个棋盘格):
(x, y, 2),其中x、y为上方被占用格子的坐标,实际占用(x,y)、(x,y+1)两个格子,2为纵向横置标识
状态转移(翻转操作)规则
不同状态下合法的翻转操作对应不同的新状态,每次翻转后需要校验所有占用格子均在棋盘边界内:
- 直立状态:向上下左右4个方向任意翻转,都会变为对应方向的横置状态
- 横向横置状态:向左/右翻转会变为对应方向的直立状态,向上/下翻转仍保持横向横置状态,整体上下移动1格
- 纵向横置状态:向上/下翻转会变为对应方向的直立状态,向左/右翻转仍保持纵向横置状态,整体左右移动1格
搜索执行流程
- 初始化队列,将长方体的初始状态加入队列,同时初始化
visited集合记录已访问过的状态,避免重复搜索 - 每次取出队列头部的状态,判断是否匹配目标状态(如直立在目标格、或横置覆盖目标格,可按需自定义判断规则),匹配则直接返回当前步数,即为最短路径长度
- 枚举当前状态所有合法翻转后的新状态,未访问过的则标记为已访问,加入队列,步数+1
- 若队列遍历完成仍未匹配到目标状态,说明不存在可行路径
性能说明
- 该方案的搜索空间仅为
棋盘行数 * 棋盘列数 * 3,即使是100*100的棋盘也仅3万个状态,运算性能完全足够,不会出现性能瓶颈。
扩展适配场景
如果你的场景中不同棋盘格的翻转成本不同,属于带权最短路径场景,只需将BFS替换为Dijkstra算法,队列替换为按累计成本排序的优先队列即可,状态定义和转移规则完全复用。
内容的提问来源于stack exchange,提问作者Ignacio Tomas Crespo
相关产品推荐
相关产品推荐

