八皇后问题求解-回溯算法

在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。

PS:在八个皇后中,每个皇后都不能在同一列或者对角线中,这样每个可以构造出来一个函数

(i!=k || abs(queen[i]-queen[k])!=abs(i-k)) 在最后证明第二个条件满足不在对角线上

思路:

构造一个完全八叉树,每个节点的子节点分为八个,总共有九层,第一层作为父节点。

在条件不满足中,就返回。


代码如下:

#include <iostream>
using namespace std;
void eightQueen(int n)
{
	int nLine = 0;
	int *queen = new int[n];
	memset(queen, 0, n*sizeof(int));

	while(nLine >= 0){

		queen[nLine]++;

		// 找到没有冲突的列
		while(queen[nLine] <= n){
			int i = 0;
			for(i = 0; i < nLine; i++){
				if(queen[nLine] == queen[i] || abs(i-nLine) == abs(queen[i]-queen[nLine])){
					break;
				}
			}
			if(i < nLine){ // 有冲突
				queen[nLine]++;
			}else{ //没有发生冲突
				break;
			}
		}

		// 最后一行中,且满足没有发生冲突
		if(nLine == n-1 && queen[nLine] <= n){
			for(int i = 0; i < n; i++){
				cout << queen[i] << " ";
			}
			cout << endl;
		}else{
			if(queen[nLine] <= n && nLine < n-1){ // 没有发生冲突,但是没有到最后一行
				nLine++;
			}else{ // 发生冲突,回溯
				queen[nLine] = 0;
				nLine--;
			}
		}
	}
}
int main(void)
{
	eightQueen(4);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值