N皇后问题(回溯递归思想)

房东的猫 提交于 2020-01-26 22:53:23

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

由此再来发展到N皇后问题

先求其解的个数://回溯算法也就是穷举法

1.每一行放一个皇后

2.放下一行的时候,进行判断:会不会出现同列,会不会出现同一斜线。斜线的判断可以归于斜率判断。

//递归回溯代码如下:#include<iostream>
using namespace std;
#include<math.h>
#define N 16
int n; //皇后个数
int sum = 0; //可行解个数
int x[N]; //标记皇后放置的列数

bool Agree(int k)
{
    int i;
    for (i = 1; i < k; i++)
        if (abs(k - i) == abs(x[k] - x[i]) || x[k] == x[i])
            return false;
    return true;
}

int queen(int t)
{
    if (t > n&& n > 0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0
        sum++;
    else
        for (int i = 1; i <= n; i++)
        {
            x[t] = i; //标记
            if (Agree(t)) 
                queen(t + 1);
        }
    return sum;
}

int main()
{
    int t;
    cin >> n;
    t = queen(1);
    cout << t;
    return 0;
}

————————————————此后补充迭代回溯的算法——————————————————

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!