八皇后问题(递归)

八皇后问题(递归)

 

二、代码

八皇后问题(递归)
#include<cstdio>
#include<cmath>
#include<stdio.h>
using namespace std;
const int maxn = 11;
int count = 0;
//P为当前排列,hashTable记录整数x是否已经在P中
int n, P[maxn], hashTable[maxn] = { false };
//当前处理排列的第index号位
void generateP(int index)
{
    if (index == n + 1)
    {
        count++;
        return;
    }
    for (int x = 1; x <= n; x++)//第x行
    {
        if (hashTable[x] == false)//第x行还没有皇后
        {
            bool flag = true;//flag表示当前皇后不会和之前的皇后冲突
            for (int pre = 1; pre < index; pre++)//遍历之前的皇后
            {//第index行的皇后的行号为x,第pre列皇后的行号为P[pre]
                if (abs(index - pre) == abs(x - P[pre]))
                {
                    flag = false;//与之前的皇后在一条对角线,冲突
                    break;
                }
            }
            if (flag)//如果可以把皇后放在第x行
            {
                P[index] = x;//令第index列皇后的行数为x
                hashTable[x] = true;//第x行已经被占用
                generateP(index + 1);//递归处理第index+1行皇后
                hashTable[x] = false;//递归完毕,还原第x行为为占用状态
            }
        }
    }
}
int main()
{
    scanf_s("%d", &n);
    generateP(1);
    printf("%d\n", count);
    return 0;
}
View Code

 

上一篇:Java:删除公共字符串问题和组队竞赛问题


下一篇:王道数据结构编程题(顺序表)