n皇后问题的非递归迭代算法(C++实现)

来源:互联网 发布:mac 浏览器兼容模式 编辑:程序博客网 时间:2024/05/22 00:17
//n皇后问题的非递归迭代算法
 
#include <iostream>
#include <cmath>


using namespace std;


class NQueen
{
private:
int numOfQueen;//the number of queens
int numOfanswer;//the number of answers
int *queen;


public:
NQueen();
NQueen(int m);
~NQueen();
bool place(int k);
void backtrack();
void showQueen();
};


NQueen::NQueen()
{
numOfQueen = 0;
numOfanswer = 0;
queen = new int [1];
}


NQueen::NQueen(int m)
{
numOfQueen = m;
numOfanswer = 0;
queen = new int [m+1];
for(int i=0;i<=m;i++)
{
queen[i]=0;
}
}


NQueen::~NQueen()
{
delete []queen;
cout<<"queens are deleted!"<<endl;
}


void NQueen::showQueen()
{
for(int i=1;i<=numOfQueen;i++)
cout<<queen[i]<<"  ";
cout<<endl;
}


bool NQueen::place(int k) //the constraint function
{
for (int j=1; j<k; j++)
if((fabs(k-j)==fabs(queen[j]-queen[k]))||(queen[j]==queen[k]))
return false;
return true;
}
void NQueen::backtrack() //非递归回溯法
{
queen[1]=0;
int k=1;
while(k>0)
{
queen[k]+=1;
while((queen[k]<=numOfQueen)&&(!place(k)))
queen[k]+=1;
if(queen[k]<=numOfQueen)
{
if(k==numOfQueen)//到达叶结点,找到可行解
{
numOfanswer++;
showQueen();
}
else //进入子结点
{
k++;
queen[k]=0;
}
}
else k--; //返回至父节点
}
cout<<"the number of the solutions:"<<numOfanswer<<endl<<endl;
}




int main()
{
int m1=4,m2=5;
NQueen Q1(m1);
cout<<"the number of queens are :"<<m1<<endl;
Q1.backtrack();


NQueen *Q2 = new NQueen(m2);
cout<<"the number of queens are :"<<m2<<endl;
Q2->backtrack();

NQueen Q3(6);
cout<<"the number of queens are :"<<6<<endl;
Q3.backtrack();

NQueen *Q4 = new NQueen(5);
cout<<"the number of queens are :"<<"5"<<endl;
Q4->backtrack();


return 0;
}
原创粉丝点击