使用的是分支限界法进行广度优先,但输出不只是分支限界法的一个解,而是所有解。
以下是程序部分:
#include<iostream>
#include<queue>
#include<math.h>
using namespace std;
class QNode
{
public:
int *x,i;//i代表层,x代表列位置.
};
class Queen{
public:
void Init(QNode *&E);
void NewNode(QNode *&N,QNode *E,int i);
bool Constrain(QNode *E);
bool Getnext(queue<QNode*>&Q,QNode *&E);
void fifobb();
int n,*bestx;
bool found;
};
void Queen::Init(QNode *&E)
{
E=new QNode;
E->x=new int[n+1];
for(int j=1;j<=n;j++)
E->x[j]=j;
E->i=0;
bestx=new int[n+1];
memset(bestx,0,sizeof(int)*(n+1));
found=false;
}
void Queen::NewNode(QNode *&N,QNode *E,int i)
{
N=new QNode;
N->x=new int[n+1];
N->i=E->i+1;
for(int j=1;j<=n;j++)
N->x[j]=E->x[j];
N->x[N->i]=E->x[i];//E与N在 i 位置和 N->i 位置进行了交换
N->x[i]=E->x[N->i];
}
bool Queen::Constrain(QNode *N)
{
for(int j=1;j<N->i;j++)
{
if((abs( N->i - j )==abs( N->x[j] - N->x[N->i])) || ( N->x[j] == N->x[N->i] ) )
return false;
}
return true;
}
bool Queen::Getnext(queue<QNode*>&Q,QNode *&E)
{
if(found||Q.empty())
return false;
E=Q.front();
Q.pop();
return true;
}
void Queen::fifobb()
{
queue<QNode*> Q;
QNode *E,*N;
Init(E);
while(true)
{
if(E->i==n)
{
for(int k=1;k<=n;k++)
bestx[k]=E->x[k];
found=true;
}
else
for(int i=E->i+1;i<=n;i++)
{
NewNode(N,E,i);
if(Constrain(N))
Q.push(N);
}
if(!Getnext(Q,E))
break;
}
for(int i=1;i<=n;i++)
{
cout<<bestx[i]<<" ";
}
cout<<endl;
while (!Q.empty())
{
E=Q.front();
Q.pop();
for(int k=1;k<=n;k++)
bestx[k]=E->x[k];
for(int i=1;i<=n;i++)
cout<<bestx[i]<<" ";
cout<<endl;
}
}
int main()
{
Queen* Qu=new Queen;
cin>>Qu->n;
Qu->fifobb();
return 0;
}