您的位置:首页 > 其它

输出所有解的n皇后问题

2014-09-25 13:24 316 查看
使用的是分支限界法进行广度优先,但输出不只是分支限界法的一个解,而是所有解。

以下是程序部分:

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐