DFS法解决n皇后问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hacker_Wind/article/details/79918571

一、问题介绍

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

二、算法详解

n皇后问题的解法有很多,本文基于DFS方法对n皇后问题进行求解。运用了递归回溯的思想,回溯的意思就是在模拟实际运算过程时,若发现走不通,则返回上一层进行其他操作。

1、从第一行第一列开始放置皇后。

2、从第一列开始遍历第二行直至可以放置皇后,此时需判断该位置是否满足不与第一行的皇后处于同一行同一列或统一斜线上。不满足则后移。

3、重复上列步骤,当行数等于n且可以放置皇后时,解决方案加一。

三、代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
//#define PI 3.14159265358979323
#define inf 0x3f3f3f3f
#define maxn 8//本文以八皇后问题为例求解认证
int queen[maxn];//定义皇后所在位置的数组
int ans=0;//答案
int check(int n)//用于检测是否满足应有条件
{
    for(int i=0;i<n;i++)//循环至n-1,若不满足条件,则会返回函数使皇后放置位置后移
    {
        if(queen[i]==queen[n]||abs(queen[i]-queen[n])==abs(i-n))//判断n行i列的位置是否满足条件
                                                                //或后面将右边除到左边为绝对值斜率为一,用于判定是否在一条斜线上
            return 0;
    }
    return 1;
}
void Nqueens(int n)
{
    for(int i=0; i<maxn; i++)
    {
        queen[n]=i;//放置皇后
        if(check(n))//满足条件的话
        {
            if(n==maxn-1)//最后一行也满足条件,可以放置皇后,则解决方案加一
                ans++;
            else        //否则继续放置下一行的皇后
                Nqueens(n+1);
        }
    }
}
int main()
{
    Nqueens(0);
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/Hacker_Wind/article/details/79918571