在M*N的棋盘上,从一指定起点,以"走日"的方式走棋盘,找到一条能走完棋盘且没有重复格子的路线。
“马走日”说明在一点上有8种可走的方向,我使用的是DFS,深度优先法。类似于走迷宫,找到一个可走的方向就闷头走下去,如果发现无路可走了(比如已走过或越界),就退回上一步,尝试下一个方向。当然问题有可能是无解的,比如一个3*3的棋盘上从(0, 0)出发,不可能走完所有格子。
经典的小游戏,九宫格上有8个板块,打乱后逐步移动,使其恢复成初始排列。我使用的是BFS,广度优先法,算法中使用一个队列辅助计算。
- 将初始状态压入队列
- 取出队列头的状态,将其移出队列,若已是最终状态则返回
- 若不是最终状态,计算出下一步可形成的多个后续状态,压入队列
- 回到2
代码中还用到了unordered_set,存储出现过的状态,以免重复处理。