输出所有解的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;
}
以下是程序部分:
#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;
}
相关文章推荐
- 【算法面试】写程序输出8皇后问题的所有排列,要求使用非递归的深度优先遍历。
- 写程序输出8皇后问题的所有排列,要求使用非递归的深度优先遍历。
- 写程序输出8皇后问题的所有排列,要求使用非递归的深度优先遍历。
- 用MFC输出所有导入函数名称时遇到的问题。
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- 任意输入一个字符串,输出它的所有子串。Python练习(未考虑去重问题)
- 打印到类阵列的给定序列的所有排列的n皇后问题
- dedeCMS-顶级栏目输出所有子栏目文章 问题的解决方案
- 利用遍历思想求解图问题(输出所有路径)
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- 素数问题(输出100以内所有素数)
- 第十二周 项目4 利用遍历思想求解图问题(输出所有路径 )
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- 问题二十:101-200之间有多少个素数,并输出所有素数。
- 8皇后问题,回溯求所有解
- 输出1到N之间所有相加等于M的数字组合(背包问题)求相加为M的所有组合--微软酷派经典面试题
- 整数划分问题:输出一个整数的所有划分并统计总划分数
- 彩球分配问题:共有12个彩球,4个红的,4个白的,4个黄的,从中挑出8个球放入3个不同的口袋(口袋编号分别为a、b、c)编写程序打印输出所有可能的放法。
- 问题五十四: 输出10000以内的所有回文素数。
- 【Python】遍历某目录下的所有文件夹与文件的路径、输出中文乱码问题