eight-queen puzzle目標是把8個皇后合理的擺放在棋盤上,使得每個皇后之間都不能互相攻擊。
對於這樣的一道問題我們首先可以將西洋棋棋盤抽象為乙個8*8的矩陣。目標就是把8個皇后放在這樣乙個矩陣中,使得他們互相之間不能攻擊(橫向,豎向,對角線)。
分析這個問題,不難發現當我們擺放乙個棋子後,對應的問題規模即可擺放棋子的位置變小了,但是擺放棋子的思路確並不會改變都是需要我們去嘗試當前行的所有列,然後根據題目限制條件判斷是否可行。這自然而然的提醒我們採用遞迴的思路去解決問題。既然要用到遞迴,我們就需要確認終止條件,否則程式將無休止的執行下去,直到爆棧。這個問題的終止條件其實也比較容易想到,當我們要嘗試的行大於棋盤的總行數時,程式應當停止,並輸出相應的解決方案。 但是,這裡會碰到乙個問題,程式執行中**是順序執行的,而當我們確認某一列不能擺放棋子時,我們應當回溯到之前的條件下,這時就要用到回溯演算法(backtracking)來保證我們每次都能回退到相同的條件情況。
確認了思路之後,附上相應的lua**來解決這個問題。
n = 8
function addqueen(a, n)
if n > n then
printsolution(a) --所有的皇后已經放置好了,列印
else
for c = 1, n do --擺放第n個皇后時迴圈嘗試每一列
if isplaceok(a,n,c) then
a[n] = c --將第n個皇后放在該行c列。
addqueen(a, n+1) --在當前棋盤條件下放置下乙個皇后
endend
endendfunction isplaceok(a,n,c)
for i = 1, n-1 do --對於之前擺放的n-1個皇后,是否滿足條件?
if(a[i] == c) or
(a[i] - i = c - n) or
(a[i] + i = c + n) then
return false;
endend
return true
endfunction printsolution(a)
for i = 1, n do
for j = 1, n do
io.write(a[i] == j and "x" or "-", " ")
endio.write("\n")
endio.write("\n")
end--
addqueen({}, 1)
演算法複習二 八皇后問題 回溯
一,問題描述 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。二,分析 採用逐步試探的方式,先從乙個方向往前走,能進則進,不能進則退並嘗試另外的路徑。首先我們來分析一下西洋棋的規則,這些規則能夠限制我們的前進,也就是我們前進途中...
廣度優先遍歷(二)八皇后
這是上篇部落格 廣度優先遍歷 一 全排列 前言 八皇后問題和解數獨問題是回溯演算法的經典例題。依然建議大家自己動手先試試,體會體會。回溯演算法框架 八皇后問題 1 在 8 8 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。2 思考 8...
第16課 遞迴的應用實戰二 八皇后問題
遞迴與回溯 8皇后問題 在乙個8 8棋盤上,有8個皇后,每個皇后佔一格 要求兩個皇后不能處在同一行 同一列或同一對角線上。找放置的位置,方向很重要,當從第一行開始,放置皇后的位置後,第二行放置時要考慮上一行的放置。即3個方向為 1,1 1,0 1,1 include define n 8typede...