八皇后

Posted Grary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后相关的知识,希望对你有一定的参考价值。

这是一个很经典的搜索题目;

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。输入无输入。输出按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。

皇后能吃掉同一行,同一列,同一对角线的角色;

所以要把八个皇后放在8*8的棋盘上,保证任意皇后并不能互相吃;在这个问题中有92个解;要求依次输出;可以扩展成n皇后问题,以及各种改版的八皇后问题;

下面是一般八皇后问题深搜的代码;

#include<iostream>
using namespace std;

int lie[100],a,su=0;
bool hang[100],d[100],dd[100];
//用三个bool和一个int数组完成搜索及回溯;具体过程不需讲;
void p(void);
void s(int);

int main()
{
    //cin>>a;可以拓展成n皇后;
    a=8;
    s(1);
    //cout<<su;可以输出解个数;
    return 0;
}

void s(int sum)//搜索函数;
{
    int i;
    for(i=1;i<=a;++i)
        if((!hang[i])&&!(d[i+sum])&&!(dd[sum-i+a-1]))
        {
            lie[sum]=i;
            hang[i]=1;d[i+sum]=1;dd[sum-i+a-1]=1;
            if(sum==a)
            {
                su++;
                p();
            }
            else s(sum+1);
            hang[i]=0;d[i+sum]=0;dd[sum-i+a-1]=0;
        }
}

void p(void)
{
    cout<<"No. "<<su<<endl;
    for(int i=1;i<=a;++i)
        {    
            for(int j=1;j<=a;++j)
                if(i==lie[j])//将所有解的矩阵输出,1代表有皇后
                    cout<<"1 ";
                else cout<<"0 ";
            cout<<endl;
                    
        }
}

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

这是noi题库上一个改版的八皇后问题;要求输出指定的皇后串;皇后串的排列为按整数大小

第一个皇后串15863724;
最后一个皇后串84136275;

0 0 1 0 0 0 0 0//这是最后一个字符串的表示
0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0


最后一个皇后串表示在第一列第八排有一个皇后、第二排第四排有一个皇后、第三列第一排······第八列第五排有皇后;

以上是关于八皇后的主要内容,如果未能解决你的问题,请参考以下文章

八皇后,回溯与递归(Python实现)

基于WPF的八皇后简单应用程序

八皇后

八皇后问题

八皇后问题的遗传算法解法,c语言编写

八皇后问题