噁心的八皇后全解python版

2021-07-17 03:31:31 字數 1526 閱讀 3621

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 的含義是在...