从象棋到算法:用马走日问题掌握DFS回溯的精髓
1. 棋盘上的数学之美
中国象棋中的"马走日"规则,看似简单的移动方式背后隐藏着丰富的数学原理。当我们将这个问题抽象到n×m的棋盘上,就形成了一个经典的图论问题:哈密尔顿路径。即在一个图中找到一条经过所有顶点且不重复的路径。
让我们先定义几个关键概念:
- 棋盘状态:可以用一个二维数组
vis[][]表示,记录每个格子是否被访问过 - 马的移动方式:在国际象棋中,马可以朝8个方向移动,形成"日"字形
- 方向数组:
dir[8][2] = { {1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}}
// 方向数组定义
int dir[8][2] = {
{1,2}, {1,-2}, {-1,2}, {-1,-2},
{2,1}, {2,-1}, {-2,1}, {-2,-1}
};
2. 深度优先搜索(DFS)的核心思想
DFS是一种用于遍历或搜索树或图的算法。在解决马走日问题时,我们可以将棋盘看作一个图,每个格子是一个节点,马的合法移动就是边。
DFS的三个关键步骤:
- 选择:从当前位置选择一个合法的移动方向
- 探索:递归地访问下一个位置
- 回溯:撤销当前选择,尝试其他可能性
提示:DFS之所以适合这类问题,是因为它能够系统地探索所有可能的路径,直到找到解或穷尽所有可能性。

&spm=1001.2101.3001.5002&articleId=153900491&d=1&t=3&u=528db971056c4a6b9b9140af2320140a)
592

被折叠的 条评论
为什么被折叠?



