N皇后问题

1 N皇后问题-回溯法

问题描述

在N×N的棋盘中放置N个皇后,使得任何两个皇后之间不能相互攻击,试给出所有的放置方法。

问题分析

  • 问题解向量:(x1, x2, … , xn)
  • 显约束:xi=1,2, … ,n
  • 隐约束:
    • 不同列:xi不等于xj;
    • 不处于同一正、反对角线:|i-j|不等于|xi-xj|

算法时间复杂度

(1)搜索1+n+n2+…+nn=(nn+1-1)/n-1≤2nn;
(2)每个节点判断是否符合规则,最多要判断3n个位置(列方向、主与副对角线方向是否有皇后)
故最坏情况下时间复杂度O(3n×2nn)=O(nn+1)

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Queen::Place(int k) {
for (int j=1;j<k;j++)
if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))
return false;
return true;
}
void Queen::Backtrack(int t) {
if (t>n) sum++;
else
for (int i=1;i<=n;i++) {
x[t]=i;
if (Place(t)) Backtrack(t+1);
}
}

2