N皇后问题要求求解在N*N的棋盘上放置N个皇后,并使各皇后彼此不受攻击的可能的棋盘布局,皇后彼此不受攻击的所有可能的布局,皇后彼此不受攻击的约束条件是:任何两个皇后均不能在棋盘同一行、同一列或者在对角线上出现。
由于N皇后问题不允许两个皇后在同一行,所以,可用一维数组X表示N皇后问题的解,X[i]表示第i行的皇后所在的列,条件表述如下:
- X[i] = X[s],则第i行和第s行皇后在同一列上
- 如果第i行的皇后在第j列,第s行的皇后在第t列,即X[i] = j 和 X[s] = t,则只要i - j = s- t 或者 i + j = s + t,说明两个皇后在对角线上,对两个等式进行变换后,得到结论,只要|i- s| = |j - t|(即|i- s| = |x[i] - x[s]|),则皇后在同一对角线上
解N皇后问题需要遍历解空间树,遍历中要随时判定当前棋盘布局是否满足要求,符合要求则继续向下遍历,直至判断得到一个满足约束条件的叶子结点,从而获得一个满足要求的棋盘布局,不符合要求的结点将被舍弃(称之为剪枝),并回溯到上一层的结点继续遍历,当整棵树遍历结束时,已获得所有满足要求的棋盘布局