八皇后:在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 或...