LeetCode 回溯法 别人的小结 八皇后 递归

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

int a[9] = { 0 };
int n = 8, cnt = 0;

//位置冲突算法 
bool isConflict(int a[], int n)//a[]位置数组,n皇后个数 
{
    int i = 0, j = 0;

    for (i = 2; i <= n; ++i)//i:位置 
    for (j = 1; j <= i - 1; ++j)//j:位置 
    if ((a[i] == a[j]) || (abs(a[i] - a[j]) == i - j))//1:在一行;2:在对角线上 
        return false;   //冲突 
    return true;//不冲突 
}

//八皇后问题:回溯算法(递归版) 
void Queens8(int k) //参数k:递归摆放第k个皇后 
{
    int i = 0;
    if (k > n)      //k>n:即k>8表示最后一个皇后摆放完毕 
    {
        printf("第%d种情况:", ++cnt);
        for (i = 1; i <= n; ++i)
            printf("%d ", a[i]);//打印情况 
        printf("\n");
    }
    else   //8个皇后未全部摆放完毕        
    {
        for (i = 1; i <= n; ++i)//摆放第k个皇后时(转下一行) 
        { //依次从列顶端开始搜索,一直到列底端,直到找到合适位置,如果未找到,自动返回上层递归(回溯) 
            a[k] = i;
            if (isConflict(a, k))
                Queens8(k + 1);//不冲突,递归摆放下一个皇后
        }
    }
    return;
}

//主函数 
int main()
{
    Queens8(1);//参数1:表示摆放第1个皇后 
    system("pause");
    return 0;
}

 

    原文作者:八皇后问题
    原文地址: https://www.cnblogs.com/heruonan/p/8337552.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞