八皇后 回溯 與 遞迴

2021-10-05 15:08:44 字數 1913 閱讀 6456

八皇后:在8x8的棋盤上,放置8個皇后,每兩個皇后不能同時出現在乙個列上或一行上或對角線上;

回溯法: 用棧(陣列arr[8])表示8行,arr[i]存放第i行所在的列(1~8), topid表示棧頂位置;

從第1行開始賦值(從1到8嘗試),並且檢查衝突

第1行賦值成功後,開始給第2行開始賦值(從1到8嘗試),並且檢查衝突

…1、每當前面一行賦值成功,則topid++,重新進入while迴圈,則開始對下一行賦值;

2、如果當前行分配1-8無法滿足條件,則將棧頂arr[topid]歸0,回退到上一行,進入while迴圈,重新對arr[topid-1]進行賦新值(arr[topid-1]++);

3、當進入while迴圈,topid為8時,說明前面對陣列成功分配了值,則將結果列印,並回退到上一行(topid-1),嘗試賦新值(arr[topid-1]++);

每當後面的行沒有新的賦值策略,則棧頂回退;最終的結果是,第1行(棧頂topid=0)的賦值到了第8列;當嘗試9時,失敗,棧頂繼續回退導致topid=-1,退出while迴圈

c++ **(回溯)

#include

#include

#define num 8

bool conflict

(int arr[num]

,int id,

int x)

}return false;

}void

printqueen

(int arr[num]

,int

* count)

printf

("\n");

}*count +=1

;printf

("count = %d\n"

,*count);}

intmain()

;int topid =0;

int count =0;

while

(topid>=0)

int x = arr[topid]+1

;while

(x < num+1&&

conflict

(arr, topid, x))if

(xelse

}system

("pause");

return0;

}

結果:count = 92種分配方法。

遞迴法

python**(遞迴) 取自《python基礎教程》

#queen.py

defconflict

(numx, state)

:for i in

range

(len

(state)):

ifabs

(state[i]

- numx)in(

0,len(state)

-i):

#很6的寫法

return

true

return

false

defqueens

(num, state)

:for pos in

range

(num):if

not conflict(pos, state):if

len(state)

== num-1:

yield

(pos,

)else

:for result in queens(num, state +

(pos,))

:yield

(pos,

)+ result

>>

>

list

(queen.queens(8,

()))

八皇后(遞迴 回溯)

設計一種演算法,列印 n 皇后在 n n 棋盤上的各種擺法,其中每個皇后都不同行 不同列,也不在對角線上。這裡的 對角線 指的是所有的對角線,不只是平分整個棋盤的那兩條對角線。注意 本題相對原題做了擴充套件 示例 輸入 4 輸出 q q q q.q.q q q 解釋 4 皇后問題存在如下兩個不同的解...

八皇后問題 回溯 遞迴 回溯 非遞迴

八皇后問題 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 我們可以嘗試在將第乙個皇后擺放在第0行第0列,為了不衝突,將第二個皇后擺放在第1行第3列 依次下去 然後發現第5行每個位置都有衝突,這說明上面4行肯定不能這麼擺放...

八皇后問題(遞迴,回溯)

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...