八皇后問題求解-回溯算法

在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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章