全排序和N皇后


```cpp
#include<iostream>
#include<cstdio>
using namespace std;

const int maxn=11;
int n,P[maxn],hashTable[maxn]={0};
//P为当前排列,hashTable记录整数x是否已在P中
//当前处理的事排列的第index位
void generateP(int index)
{
    if(index==n+1)  //递归边界 此时已经处理完1-N位
    {
        for(int i=1;i<=n;i++)
        {
            cout<<P[i]; //输出当前排列
        }
        cout<<endl;
        return ;
    }

    for(int x=1;x<=n;x++) //枚举1-n 试图将x填入P[index]
    {
        if(hashTable[x]==0) //如果x不在P[0]-P[index-1]中
        {
            P[index]=x;  //令P的第ind位为x,即把x加入当前排序
            hashTable[x]=1; //记x已在P中
            generateP(index+1); //处理排列的第index+1位
            hashTable[x]=0; //已处理完P[index]为x的子问题 还原状态
        }
    }
}

```cpp
int main()
{
    n=3;  //输出1-3的全排列
    generateP(1); //从1开始填
    return 0;
}

上面就是全排列的实现。N皇后本质上就是一个全排列的问题
比如实现5皇后 a[1]-a[5]分别表示第一行到第五行,a[i]中的数表示这一行的皇后位于第几列,则N皇后就成了下列问题:
求出N的全排列,且任意两个数不得满足abs(i-j)==abs(P[i]-P[j]) (任意两个皇后不得在同一对角线上)

#include<iostream>
#include<cstdio>
using namespace std;

int count=0;
const int maxn=11;
int n,P[maxn],hashTable[maxn]={0};

void generateP(int index){
    if(index==n+1){
        bool flag=true;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(abs(i-j)==abs(P[i]-P[j]))  //在同一对角线上 ,则不合法
                    flag=false;
            }
        }
        if(flag) count++;  //合法,count++
        return;
    }
    for(int x=1;x<=n;x++)
    {
        if(hashTable[x]==0)
        {
            P[index]=x;
            hashTable[x]=1;
            generateP(index+1);
            hashTable[x]=0;
        }
    }
}



int main()
{
    n=8;
    generateP(1);
    cout<<count;
    return 0;
}

输出位92 8皇后的问题答案是92.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值