回溯法解决N皇后问题——递归与非递归求解

回溯法其实也是一种搜索算法,它可以方便的搜索解空间。 
回溯法解题通常可以从以下三步入手: 
1、针对问题,定义解空间 
2、确定易于搜索的解空间结构 
3、以深度优先的方式搜索解空间,并在搜索的过程中进行剪枝 
回溯法通常在解空间树上进行搜索,而解空间树通常有子集树和排列树。 
针对这两个问题,算法的框架基本如下: 

用回溯法搜索子集合树的一般框架

void backtrack(int t){
  if(t > n) output(x);
  else{
    for(int i = f(n,t); i <= g(n,t);i++){
          x[t] = h(i);
          if(constraint(t) && bound(t)) backtrack(t+1);
     }
  }
}

网上看到些非递归解法,需要申请了些额外空间,我这里没有另外开辟空间,仅供参考,如果有问题,请留言。

不过我这里没考虑算法效率,网上有用公式求解,还有利用位操作进行计算的,有兴趣的可以关注下。

#include 
#include 
#include 
using namespace std;
void Queen_n(int n);
int main()
{
	int n;//N皇后
	scanf("%d",&n);
	Queen_n(n);
	return 0;
}
bool place(int *x,int col,int n)
{
	for(int i=0;i n-1 )
	{
		sum ++;
		printf("Column\tRow\n");
		for(int i=0;i=0)
	{
		x[i] += 1;
		while(j


你可能感兴趣的:(C/C++)