n皇后問題的非遞歸迭代算法(C++實現)

//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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章