python實現八皇后

2021-07-04 23:52:46 字數 2565 閱讀 7972

要求:在 8 * 8 的棋盤上,8 個皇后不在同行、同列、同對角線。

(1)定義衝突

>>> def conflict(state, nextx):

nexty = len(state)

for i in range(nexty):

if abs(state[i] - nextx) in (0, nexty - i):

return true

return false

其中,nextx 指下乙個皇后將要放置的橫座標,也就是列。nexty 指下乙個皇后將要放置的縱座標,即行。state是乙個列表,列表內存放著已經放置好的皇后的位置,即存放著元組 (x , y) ,state[ i ] = j 指第(i + 1)行的皇后在第(j + 1)列。

注: if abs(state[i] - nextx) in (0, nexty - i):  中的 (0, nexty - i):  指前面的數是否為 0 或者 nexty - i 兩者中的乙個,並不是指處在某個範圍裡面。

(2)放置皇后

>>> def queens(num = 8, state = ()):

for pos in range(num):

if not conflict(state, pos):

if len(state) == num - 1:

yield (pos,)

else:

for result in queens(num, state + (pos,)):

yield (pos,) + result

注:程式分為   if len(state) == num - 1:  和  else:  兩部分,是因為,遞迴都需要有乙個遞迴結束的點,否則,遞迴就會無止境的不斷進行下去。

其中, for pos in range(num):  這一行,指的是給將要放置的新皇后,她的縱座標已固定(由定義衝突裡的 nexty = len(state) 來固定的),所以,需要在8個列位置上,給她進行選擇放置的位置。

如果放置 4 個皇后,則有 2 種放置方法:

>>> list(queens(4))

[(1, 3, 0, 2), (2, 0, 3, 1)]

應用 print 可以把不同的放置方法,一行一行列印出來。

(3)打包輸出

輸出簡易的放置了皇后的棋盤。

>>> def prettyprint(solution):

def line(pos, length = len(solution)):

return '.   ' * (pos) + 'x   ' + '.   ' * (length - pos - 1)

for pos in solution:                          #依次取出隨機挑選的方案裡的每個數,即每位皇后在自己的行中坐所在的列。

print (line(pos))

>>> import random

>>> prettyprint(random.choice(list(queens(8))))        #在queens(8) 的方案裡隨機挑選乙個

.   .   x   .   .   .   .   .

.   .   .   .   .   x   .   .

.   .   .   .   .   .   .   x

.   x   .   .   .   .   .   .

.   .   .   x   .   .   .   .

x   .   .   .   .   .   .   .

.   .   .   .   .   .   x   .

.   .   .   .   x   .   .   .

#!bin/usr/python

def conflict(state,nextx):

nexty=len(state)

for i in range(nexty):

if abs(nextx-state[i]) in (0,nexty-i):

return true

return false

def queen(side_length,state=()):

for pos in range(side_length):

if not conflict(state,pos):

if len(state)==side_length-1:

yield (pos,)

else:

for result in queen(side_length,state+(pos,)):

yield (pos,)+result

def prettyprint(solution):

def line(pos, length = len(solution)):

return '.'*(pos) + 'x' + '.'*(length-pos-1)

for pos in solution:

print line(pos)

for solution in list(queen(4)):

prettyprint(solution)

Python實現八皇后問題

八皇后問題是指8 8位的棋盤上,擺8個皇后,使得任意乙個皇后不在其他皇后的同一橫線上,同一豎線上,同一斜線 包括右上到左下斜線和左上到右下斜線 上。這個問題是乙個經典的遞迴問題。八皇后問題主函式 n 0 總的解的數量 defehh sovle deep,graph,path 解決八皇后問題的函式 f...

八皇后問題python實現

def check x,y 對當前行的所有行進行 for row in range x column queens row 不能是同一列 if y column return false 對角線 if abs x row abs y column return false return true d...

八皇后問題python實現

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