回溯法解决八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。

这个问题简化描述就是:在8x8的棋盘上放8颗子,要求它们【不在同一行】【不在同一列】【不在同一斜线】上。 
所以我们的约束条件可以进行如下表示: 

  1. 同行判断: 
    column[i] != column[j]
  2. 同列判断: 
    i != j
  3. 斜线判断: 
    col[i] + Math.abs(j - i) != col[j](正斜线) 
    col[i] - Math.abs(j - i) != col[j](反斜线)

求解思路: 

首先从第一个皇后开始,从第一行确定第一个皇后位置,然后再在第二行搜索第二个 皇后位置……没前进一步检查是否满足约束条件,不满足的时候回溯到上一个皇后位置,尝试该行的其他列是否满足条件,直到找到问题的解。

回溯法的基本思想是:

  1. 在解空间树中,从根节点出发,采用深度优先搜索的思想来遍历解空间树。每一次遍历节点时都判断当前 节点是否为合法解,如果为合法解,那么继续遍历其自子树,如果不是合法节点,那么访问其下一个兄弟节点,如果没有下一个兄就退回到父节点(回溯),访问父节点下一个兄弟节点。
  2. 回溯法结束的条件是回溯到根节点而且所有子树均已遍历到。
  3. 回溯法归根结底是一种带有节点判断条件的深度优先搜索算法。

猜你喜欢

转载自blog.csdn.net/qq_41773830/article/details/80951815