import random
defconflict
(state, nextx):
nexty = len(state)
for i in range(nexty):
if abs(state[i]-nextx) in (0, nexty-i):
#這塊我看到了網上的一些誤導,
#這裡只查(對角線關係和不同行同列關係)。
#同行問題已經在prettyprint那裡確保了。
#"it is true if the horizontal distance
#between the next queen and the previous one
#under consideration is either zero (same column)
#or equal to the vertical distance (on a diagonal).
#otherwise, it is false."
#再展開一點點,
#這裡用兩個點之差算橫座標,不能等於縱座標的差。來確保對角線問題。
#棋盤是方滴嘛
return
true
return
false
defqueens
(num, state=()):
#這個state=()說明state一上來是乙個空元組。
#這部分**在zhihu上的解釋,個人覺得很好:
#for pos in range(num):
ifnot conflict(state, pos):#這個if是沒有else的,因為當跑到conflict那裡為真的時候,層層stack就被返上來,取消掉了整個這組排列(也就是沒結果)
if len(state) == num-1:
yield (pos, )
else:
#這裡多種組合分叉著走,也是遍歷的關鍵。
for result in queens(num, state+(pos,)):
yield (pos, ) + result
defprettyprint
(solution):
defline
(pos, length=len(solution)):
return
'. ' * (pos) + 'x ' + '. '*(length-pos-1)
for pos in solution:
print line(pos)
if __name__ == "__main__":
print list(queens(8))
prettyprint(random.choice(list(queens(8))))
#if main以上的部分其實是把所有皇后布陣都給出來了,random.choice是選擇了其中乙個list 去列印。
最後想說,這個八皇后問題,讓我用上面這種表達方式,我是無法想到的。一上來那步空元組佔位,就直接把我秒了。
光理解就費了很大的功夫,佩服佩服。
python全排列解決八皇后問題
八皇后問題是指8x8的西洋棋棋盤上,如何放置8個皇后,使得任意兩個皇后不會互相攻擊。算上對稱解的話,八皇后問題有91個解 當然,我們習慣從0開始計數 不難想到,用 0,1,2,3,4,5,6,7 八個數字組成個tuple,其中數字所在位置代表了行,數字本身代表了列,則任意乙個排列即代表一種放置方法,...
python回朔演算法解八皇后問題
八皇后問題的解題思路 總共有92種解法,這裡舉例一種 def place x,k 判斷是否衝突 for i in range 1,k x i x k 判斷是否為同一行 abs x i x k abs i k 判斷是否在k個的對角線上 if x i x k or abs x i x k abs i k...
八皇后的12組等效解
請使用回溯法程式設計,輸出8皇后的所有解,並統計其中等效解的個數 所謂等效解是指,如果將解a 上下翻轉,左右翻轉,90度旋轉等任意組合,如果能得到b,則稱a和b為等效解 要求 1.輸出形式 如果有n個等價類 組1 共10個 1,2,x8 組2 共.個 組n 共.個 其中 x1,x2,x8 的含義是在...