八皇后问题
八皇后问题是经典的回溯算法应用案例,由国际象棋棋手马克斯・贝瑟尔于 1848 年提出。问题要求在 8×8 的国际象棋棋盘上放置 8 个皇后,使得任意两个皇后不能处于同一行、同一列或同一斜线上,最终找出所有可能的摆放方案。
一、问题核心约束
放置皇后时需满足以下条件:
- 不同行:每一行只能放置 1 个皇后(可通过按行放置天然满足)。
- 不同列:任意两个皇后不能在同一列。
- 不同斜线:任意两个皇后不能在同一对角线(包括主对角线和副对角线)。
若用坐标 (row, col) 表示皇后位置,则对于两个皇后 (r1, c1) 和 (r2, c2),需满足:
- $ c1 \neq c2 $(不同列)
- $(|r1 - r2| \neq |c1 - c2|)$(不同斜线,即行差不等于列差)
二、解决方案:回溯算法
回溯算法是解决八皇后问题的最优方法,其核心思想是逐行尝试放置皇后,若当前位置不满足约束则回退到上一行,尝试下一列,直到找到所有合法方案。
算法步骤:
初始化:创建一个数组
queens记录每一行皇后的列位置(索引为行号,值为列号)。递归放置:从第 0 行开始,逐行尝试在每一列放置皇后:
- 检查当前列是否与已放置的皇后冲突(列冲突或斜线冲突)。
若不冲突,放置皇后并递归处理下一行。
若冲突,尝试下一列。