python八皇后問題2種解法

2021-10-03 18:26:29 字數 3781 閱讀 6462

# 八皇后問題:

# 思路:確保每乙個皇后的左上角、右上角或正上方沒有皇后,用這個規則遞迴地每一行,再每一列迴圈過去,每一列或每一行只有乙個元素

from tkinter import *

from pil import image, imagetk

size =

8class

eightqueen

: def __init__

(self)

: self.queens = size *[-

1] # 存放該行對應的列數

self.

search(0

) window =tk(

) window.

title

("eightqueen demo"

) image=imagetk.

photoimage

(file=r"c:\users\lenovo\desktop\queen.png"

) self.canvas=

canvas

(window)

self.canvas.

pack()

for i in range

(size)

:for j in range

(size)

:if self.queens[i]

== j:

label

(self.canvas,image=image)

.grid

(row=i,column=j)

else

:label

(self.canvas,bg=

"red").

grid

(row=i,column=j)

window.

mainloop()

def search

(self, row)

:if row == size:

return true

else

:for column in range

(size)

: self.queens[row]

= column

if self.

isvalid

(row, column)

and self.

search

(row +1)

:return true

# 判斷規則

def isvalid

(self, row, column)

:for i in range(1

, row +1)

: # 表示範圍是[

1,row]

,下面對方下標是[

0,row-

1]的取值範圍

八皇后問題

"""import random

# 1、檢查衝突

# 引數nextx表示下乙個皇后的水平位置(x座標,即列),而nexty為下乙個皇后的垂直位置(y

# 相同或在同一條對角線上,將發生衝突,因此返回true;如果沒有發生衝突,就返回false。比

# 較難理解的是下面的表示式:

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

# 如果下乙個皇后和當前皇后的水平距離為0(在同一列)或與它們的垂直距離相等(位於一

# 條對角線上),這個表示式就為真;否則為假

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

# 2.基線條件

# 這段**的意思是,如果只剩下最後乙個皇后沒有放好,就遍歷所有可能的位置,並返回那

# 些不會引發衝突的位置。引數num為皇后總數,而引數state是乙個元組,包含已放好的皇后的位

# 置。

# def queens(num, state):

# if len(state) == num-1:

# for pos in range(num):

# if not conflict(state, pos):

# yield pos

# 可在遞迴條件中假設來自更低層級(編號更大的皇后)的結果都是正確的。

# 因此,只需在函式queens的前述實現中給if語句新增乙個else子句。

# 你希望遞迴呼叫返回什麼樣的結果呢?你希望它返回當前行下面所有皇后的位置,對吧?假

# 設位置是以元組的方式返回的,因此需要修改基線條件,使其返回乙個(長度為1的)元組,但

# 這將在後面處理。

# 因此,對於遞迴呼叫,向它提供的是由當前行上面的皇后位置組成的元組。對於當前皇后的

# 每個合法位置,遞迴呼叫返回的是由下面的皇后位置組成的元組。為了讓這個過程不斷進行下去,

# 只需將當前皇后的位置插入返回的結果開頭

def queens

(num=

8, state=()

):for pos in range

(num):if

notconflict

(state, pos):if

len(state)

== num -1:

yield (pos,

)else

:for result in queens

(num, state +

(pos,))

: yield (pos,

)+ result

def pretty_print

(solution)

: def line

(pos, length=

len(solution)):

return

'. '

*(pos)

+'x '

+'. '

*(length - pos -1)

for pos in solution:

print

(line

(pos)

)def main()

:pretty_print

(random.

choice

(list

(queens(8

))))# 隨機獲取1種解法

八皇后問題的一種python解法

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種...

八皇后問題的三種解法

會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2 b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后...

八皇后問題的兩種解法

八皇后問題,是回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋 上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林 的象棋雜誌上不同的作者發表了40種不同的解,後...