过年的时候,几个侄女拿着手机找到我,请教我游戏的解法,游戏画面大致如下:
该怎么给外甥女说呢?
我这样想的,采用暴力解决方案,进行无限次的尝试,最终会找到解。 玩这个游戏最重要的是培养人的耐心,我一边说着一边操作,进行了大概几十次操作,通过了。 外甥女对我投来了崇拜的眼神,我接着说,其实这里不只是简单的暴力尝试这么简单,我们可以研究一套自动算法,找到最优的解决路径。
后面被叫去吃饭了,关于游戏的思考中断了。
回来之后,我重新思考这个问题,如何找到最优解呢?这些游戏看似简单,我们把他抽象成一个编程题,输入为一个 nn 的矩阵,其中填充了 0 到 nn-1 的数字,假设 0 是空格子,每次只能移动 0 元素相邻的元素与其交换位置,最终输出移动格子的序列号,使得矩阵顺序排列。
通过查找网络和 AI 工具,了解到确实有一些算法来帮助解决这些谜题如下:
他们的时间复杂度和空间复杂度各不相同,我将他们部署到前端页面,发现他们的效果对不同的场景差异很大。
以下是 deepseek 的对他们时间空间复杂度对比
算法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
Pattern Solving | O(1) | O(1) | 快速解决特定简单局面 |
A* (Manhattan) | ~O(b^(d/2)) | O(b^d) | 需平衡速度与内存的中等规模问题 |
A* (Misplaced Tiles) | ~O(b^d) | O(b^d) | 简单场景,启发式要求不高 |
A* (Linear Conflict) | ~O(b^(d/2)) | O(b^d) | 复杂障碍下的高效求解 |
IDA* | O(b^d) | O(b*d) | 内存受限,允许牺牲时间换取空间 |
Bidirectional BFS | ~O(b^(d/2)) | O(b^(d/2)) | 内存充足,追求最快解 |
受到哥飞老师影响,开发了一个站点,研究了提供滑块拼图的解决方案。
这里提供了 6 种算法方案,经过测试发现,简单的 case ,如只需要挪动一格 方法 2-6 能给出结论,但是稍微复杂一些的情况,就卡死了。
方法 1 虽然稳定,但是对于只需要挪动一格场景,也会给出 103 步的方案
还有没有好的办法呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.