# 八皇后問題:
# 思路:確保每乙個皇后的左上角、右上角或正上方沒有皇后,用這個規則遞迴地每一行,再每一列迴圈過去,每一列或每一行只有乙個元素
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種不同的解,後...