N皇后递归法和回溯法实现

设计了一个类
构造函数就是构建N皇后的棋盘状态
有2个函数是递归法的求解
有2个函数是迭代法的求解
有1个函数是输出解的个数
详细见注释
 

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

class Queen
{
private:
    int n=4;        //棋盘大小
    int *x;         //解空间
    int sum=0;      //解个数
public:
    Queen(){}
    Queen(int k);
    ~Queen();
    bool Place(int k);          //递归法判断第k行的放置方法是否合法
    void Back_track(int t);     //递归法
    void print_sum();           //输出解的个数
    void iterat_get_sum();      //迭代法
    bool check(int loc);        //迭代法判断是否满足条件
};
void Queen::print_sum()
{
    cout<<"sum:"<<sum<<endl;
}
Queen::Queen(int k)     //构建棋盘
{
    n=k;
    x = new int[k];
    for(int i=0;i<n;i++)
        x[i]=0;
}
Queen::~Queen()
{
    delete[] x;
}
bool Queen::Place(int k)
{
    for(int i=0;i<k;i++)
    {
        if( (abs(k-i) == abs(x[k]-x[i])) ||x[k] == x[i] )     //如果第k行和前面的任一行的位置在同一条对角线上或者是在同一列上,就返回false
            return false;
    }
    return true;
}
void Queen::Back_track(int t)       //递归法的判断是否能满足条件
{
    if(t >= n) {
        ++sum;
    }
    else {
        for(int i = 0; i < n; i++) {
            x[t] = i;             //每次第t行都从第1个位置开始放置,如果放置合法,就继续尝试下一行,如果放置不合法,就尝试放置下一个位置
            if(Place(t))
                Back_track((t+1));
        }
    }
}
bool Queen::check(int loc)       //迭代法的判断是否能满足条件
{
    for(int i=1; i<loc; i++){
        if(x[i]==x[loc] || abs(x[loc]-x[i]) == abs(loc-i) )
            return false;
    }
    return true;
}
void Queen::iterat_get_sum() {  //迭代法
    sum = 0;        //sum清空,避免递归法结果的影响
    int loc = 0;
    while(loc >= 0){
        x[loc]++;
        if(x[loc] == n+1)
            --loc;
        else if( check(loc) ){
            if(loc == n){
                ++sum;
                --loc;
            }
            else{
                ++loc;
                x[loc] = 0;
            }
        }
    }
}
int main()
{
    long t;
    for(int i = 5; i < 20; ++i) {
        cout<<"棋盘大小:"<<i<<endl;
        Queen Q(i);
        t = clock();
        Q.Back_track(0);
        cout<<"递归时间:"<< clock() - t<<' ';
        Q.print_sum();

        t = clock();
        Q.iterat_get_sum();
        cout<<"迭代时间:"<< clock() - t<<' ';
        Q.print_sum();
        cout<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值