八皇后问题-递归和迭代两种解法

问题:

经典的八皇后问题

分析:

递归解法直观易懂,但是迭代法需要想点思路

代码如下:

/*
 * eightQueen.cpp
 *
 *  Created on: 2012-10-14
 *      Author: happier
 */

#include <iostream>
using namespace std;

#define N 8
int sum = 0;
int *x = new int[N + 1];

bool place(int k)
{
	int i;
	for (i = 1; i < k; i++)
	{
		if (x[i] == x[k] || abs(i - k) == abs(x[i] - x[k]))	//第一个判断行不能相同,第二个判断对角线不能相同
			return false;
	}
	return true;
}

void backtrack2()//迭代回溯
{
	int i;
	x[1]=0;
	int k=1;
	while(k>0)
	{
		x[k]+=1;//当前列加1的位置开始搜索
		while((x[k]<=N) && !place(k))//当前列位置是否满足条件
			x[k]+=1;//不满足条件,继续搜索下一个位置

		if(x[k]<=N)//存在满足条件的列
		{
			if(k==N)//是最后一个皇后,完成搜索
			{
				for(i=1; i<=N; i++)
					cout<<x[i]<<" ";
				cout<<endl;
				sum++;

			}
			else//不是,则处理下一个皇后
			{
				k++;
				x[k]=0;
			}
		}
		else//回溯
		{
			k--;
		}

	}
}

void backtrack(int t) //递归回溯
{
	int i = 0;
	if (t > N)	//递归结束返回
	{
		for (i = 1; i <= N; i++)
			cout << x[i] << " ";
		cout << endl;
		sum++;
	}
	else
	{
		for (i = 1; i <= N; i++)
		{
			x[t] = i;	//选择一个皇后
			if (place(t))	//判断第t列,第i行放一个皇后是否合法
				backtrack(t + 1);
		}
	}
}
int main()
{

	backtrack(1);
	cout << sum << endl;
	sum = 0;
	backtrack2();
	cout << sum << endl;

	return 0;
}

总结:

这里迭代法没有用栈去模拟,因为理解了其中的含义,可以写出非递归法,但是本质上还是存在回溯的。

参考:http://blog.csdn.net/cxllyg/article/details/8055596

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/lxmky/article/details/8069699
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞