设计了一个类
构造函数就是构建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;
}