算法之n皇后问题

1. 问题描述:n×n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n×n的棋盘上放置n个皇后,任何2个皇后不能放在同一行或同一列或同一斜线上。

2. 问题分析:

n元数组x[n]表示问题的解。其中x[i]表示皇后i放在棋盘第i行第x[i]列。由于不允许将2个皇后放在同一列上,所以解向量中的x[i]互不相同,

2个皇后不能放在同一斜线上是问题的隐约束。设2个皇后的放置位置分别是(i,j)(k,l),则如果满足|i-k|=|j-l|,就表明2个皇后位于同一条斜线上。

分析可知,解空间树是完全n叉树,剪枝函数剪去不满足行、列、斜线约束的子树。

#include 
#include 
using namespace std;

int N=5;
int x[5]; //可行解
int sum=0;//可行解数量

bool Place(int k)
{
    for(int i=0; i=N)
    {
        sum++;//到达叶子结点,即找到了一个新的可行解,则解的数量sum++;
        for(int i=0; i=0)
    {
        while(x[k]

3.时间复杂度:最坏时间复杂度Place方法O(n),所以Backtrack方法时间复杂度为O(n^3);




你可能感兴趣的:(算法学习笔记)