八皇后問題的一種python解法

2021-08-28 10:36:28 字數 2389 閱讀 5356

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種方法可以解決此問題。

回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。八皇后問題就是回溯演算法的典型,第一步按照順序放乙個皇后,然後第二步符合要求放第2個皇后,如果沒有位置符合要求,那麼就要改變第乙個皇后的位置,重新放第2個皇后的位置,直到找到符合條件的位置就可以了。

本解法來自<#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""file name: queens.py

time : 2018/9/24 22:57

ide :pycharm

author :administrator

"""import random

defconflict

(state, nextx)

: nexty =

len(state)

print

("將要檢測第{}行,{}列的位置是否與既有皇后位置為{}衝突"

.format

(nexty, nextx, state)

)for i in

range

(nexty):if

abs(state[i]

- nextx)in(

0, nexty - i)

:print

("\033[7;31;40m檢測結果{}行{}列的位置與既有皇后中第{}行{}列位置的皇后衝突\033[0m"

.format

(nexty, nextx, i, state[i]))

return

true

print

("\033[7;32;40m檢測結果:{}行{}列的位置與既有皇后位置{}不衝突\033[0m"

.format

(nexty, nextx, state)

)return

false

defqueens

(num=

8, state=()

):for pos in

range

(num):if

not conflict(state, pos)

:print

("\033[7;36;40m既有皇后位置為{},第{}行皇后的合法位置位於{}列\033[0m"

.format

(state,

len(state)

, pos))if

len(state)

== num -1:

print

("第0行至第{}行的皇后位置為{},最後一行皇后位置的橫座標為{}"

.format

(num -

2, state, pos)

)yield

(pos,

)else

:print

("當前皇后位於第{}行,將進入下一輪遞迴"

.format

(len

(state)))

print

("下一輪遞迴中的已知既有皇后的位置為{}"

.format

(state +

(pos,))

)for result in queens(num, state +

(pos,))

:print

("\033[7;44;40m既有皇后位置為{}\033[0m"

.format

(state +

(pos,))

)print

("\033[7;44;40m當前行下面皇后位置為{}\033[0m"

.format

(result)

)yield

(pos,

)+ result

defprettyprint

(solution)

:def

line

(pos, length=

len(solution)):

return

"."*pos +

"x"+

"."*

(len

(solution)

-pos-1)

for pos in solution:

print

(line(pos)

)prettyprint(random.choice(

list

(queens(8))))

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...

python八皇后問題2種解法

八皇后問題 思路 確保每乙個皇后的左上角 右上角或正上方沒有皇后,用這個規則遞迴地每一行,再每一列迴圈過去,每一列或每一行只有乙個元素 from tkinter import from pil import image,imagetk size 8class eightqueen def init ...

八皇后12種本質不同的解

在八皇后的92種解中有大量的解是本質重複的 可以通過左右對稱,上下對稱,對角線對稱,旋轉來互相轉化 只有十二種解是本質不同的。include int w 1 intcheck int m void put void intcheck3 void intcheck2 void void firstdi...