八皇后问题

关于八皇后的一种数学解决方法:

众所周知八皇后问题中

当你需要在新的每一行中添加一个皇后时 你都需要判断该点所在的行,列,和左右两个斜对角线上是否存在皇后,

可能传统的方法你会想到一个个找毕竟计算机运算能力强大! 其实错误!不要忘记了数学! 有了数学的利器,代码写的少了而且运算更加快!

设一个函数来判断一个点能否放皇后的代码如下:

row为行  col为列 这都是需要传进来的参数

bool queen::place(int row,int col){
    if(row == 1)  return true;//显然当为第一行时肯定不需要判断 因为没有任何皇后!
    for(int j = 1;j<row;j++)//此处的 j 相当于从第一行开始寻找比如,a 为我设置的一个数组,其实很简单 假设  我在第一行的第二列放用一个皇后 那么我就令a【1】= 2;
    {
        if(a[j] == col) return false;//a其实就相当 于存储一个行上皇后所在的列数,此时如果你想放皇后的位置所在的列已经有皇后了当然要返回false
        if(abs(j-row) == abs(a[j]-col)) return false;//这就用到数学了!相当于是横坐标与纵坐标,把棋盘想象为一个坐标系如果两个点的横坐标之差的绝对值与枞坐标之差的绝对值相等毫无疑问那这两点必定在同一条斜直线上 所以返回false
    }
    return true;
}
以下是八皇后的完整代码:

#include<iostream>
#include<cmath>
using namespace std;
int count = 0;
class queen{
    public:
        void showresult(int number);
        void shownumber();
        bool place(int row,int col);
            int a[9];
};
void queen::shownumber(){
    cout<<count<<endl;
}
bool queen::place(int row,int col){
    if(row == 1)  return true;
    for(int j = 1;j<row;j++)
    {
        if(a[j] == col) return false;
        if(abs(j-row) == abs(a[j]-col)) return false;
    }
    return true;
}
void queen::showresult(int number){
    int i,j;
    for(i = 1;i<=number;i++)
    {
        for(j = 1;j<a[i];j++)
        cout<<"0";
        cout<<"1";
        for(j++;j<=number;j++)
        cout<<"0";
        cout<<endl;
    }
}
void back(int t,queen&hu,int number)
{
    if(t>number){
        cout<<"------------------------"<<endl;
        hu.showresult(number);
        count++;
    }
    else{
        for(int j = 1;j<=number;j++)
        {
            if(hu.place(t,j))
            {
                hu.a[t] = j;
                back(t+1,hu,number);
            }
        }
    }
}
int main()
{
    queen hu;
    int number;  
    cout<<"请输入您想要计算的皇后数目:";
    cin>>number;
    back(1,hu,number);
    hu.shownumber();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值