八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
上图就是八皇后问题的其中一种解法,八皇后问题采用回溯算法来解决,如果读者不能很好的理解递归的话,可能理回溯算法很吃力,回溯算法的核心思想类似于深度优先搜索,如果当前结点可行,就搜索当前结点的一个子结点,反之,就回溯,搜索当前结点的子结点。递归所生成的树是一棵深度优先搜索树,叶子结点是那些不合法的结点(换句话说,就是无法向下递归的结点)和答案结点。
我们来模拟一遍4皇后问题,便于读者理解。
对于第一行: 对于第二行: 对于第三行: 对于第四行:
(1,1) a (2,1) e (3,1) i (4,1) m
(1,2) b (2,2) f (3,2) j (4,2) n
(1,3) c (2,3) g (3,