n皇后问题与八皇后

这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。

当且仅当n = 1 或 n ≥ 4 时问题有解。

class Queens {
public:
    int sum=0;//排列方法数

    //验证能否放棋子,n代表行数
    bool Test(int chess[],int cur)
    {
        for(int i=0;i<cur;i++)
        {
         //验证是否会有冲突,从第0行到第cur-1行,chess[j]==chess[n]验证是否在相同的列,后面
	     //则是验证他们是否在同一斜线上,利用了如果在同一斜线,则行数的差等于列数的差来验证
            if(chess[i]==chess[cur]||abs(i-cur)==abs(chess[cur]-chess[i]))
                return false;
        }
        return true;
    }
    
//回溯算法。假设从cur行开始,如果cur==n,那么已经到最后一行,可以保存了;
//如果不是,就从第一列开始给这一行赋值,然后验证是否可以赋值,可以的话再放入下一行的棋子,否则就继续代入下一列来验证,直到结束。
    void Queen(int chess[],int n,int cur)
    {
        if(cur==n)
        {
             sum++;
            return;
        }
        else
        {
            for(int j=0;j<n;j++)
            {
                chess[cur]=j;
                if(Test(chess,cur))
                {
                    Queen(chess,n,cur+1);
                }
            }
            return;
        }
    }
    int nQueens(int n) {
        int chess[n];//chess[i]表示i行chess[i]列上有皇后
        for(int i=0;i<n;i++)
            chess[i]=0;
        Queen(chess,n,0);
        return sum;
    }
};

打印:

 已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

#include <algorithm>
#include <iostream>
#include <vector>
#define N 8
using namespace std;
int chess[N]={0};
vector< vector<int> > res;
//int result=0;
bool test(int cur)
{
    for(int i=0;i<cur;i++)
    {
        if(chess[i]==chess[cur]||abs(chess[i]-chess[cur])==abs(cur-i))
            return false;
    }
    return true;
}

void insert()
{
    vector<int> temp;
    for(int i=0;i<N;i++)
    {
        temp.push_back(chess[i]);
    }
    //result++;
    res.push_back(temp);
}
void Queen(int cur)
{
    if(cur==N)
    {
        insert();
        return;
    }else{
        for(int i=0;i<N;i++)
        {
            chess[cur]=i;
            if(test(cur))
            {
                Queen(cur+1);
            }
        }
        return;
    }
}

int main()
{
    Queen(0);
    int b;
    cin>>b;
    for(int i=0;i<N;i++)
    {
        cout<<res[b-1][i]+1;
    }
    cout<<endl;
    return 0;
}

 不需要排序,默认的排列顺序就是从小到大。

参考:https://blog.csdn.net/JasonChuanChang/article/details/15339749

猜你喜欢

转载自blog.csdn.net/weixin_42135399/article/details/82257106