您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页n皇后问题-笔记

n皇后问题-笔记

来源:欧得旅游网

即在一个n×n的棋盘上摆放n个皇后,使其中任意两个皇后都在不同行同列,也不在一条斜线上。请求出它所有的摆法。(一行一种摆法)
这里我们用的是回溯法
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
优点:程序结构明确,可读性强,易于理解,而且通过减少不必要的重复提高运行效率。
缺点:但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯法,因为它花费的时间比较长。
从n×n的棋盘的第一格开始遍历放第一个皇后,然后在不冲突已经摆放好的皇后的情况下放下一行皇后,一旦冲突就终止,最后将满足放下n个皇后的摆法输出。总体上就是遍历加break。
代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int N;
int queenPos[50];
void NQueen(int k)
{
	int i;
	if( k == N ){//在0~k-行皇后已经摆好的情况下,摆第k行及其后面的皇后 
		for(i=0;i<N;i++)
		    cout<<i+1<<"行"<<queenPos[i]+1<<"列 ";
		cout<<endl;
		return ;
	}
	// 逐个尝试第k个皇后的位置
	for(i=0;i<N;i++){ //列
		int j;
		for(j=0;j<k;j++){//行
			//和已经摆好的k个皇后的位置相比,看是否冲突 
			if( queenPos[j] == i||
			       abs(queenPos[j]-i) == abs(k-j)){//同列或在对角线处 
			       	break;//冲突。则试下一个位置 
			       }
			} 
				if(j == k){//当前的位置i不冲突 
				queenPos[k]=i;//将第k个皇后摆放在位置 i 
				NQueen(k+1);
		}
	} 
}

int main()
{
	cout<<"How many queen?" <<endl;
	cin>>N;
	NQueen(0);
	return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务