八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯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)
("將要檢測第{}行,{}列的位置是否與既有皇后位置為{}衝突"
.format
(nexty, nextx, state)
)for i in
range
(nexty):if
abs(state[i]
- nextx)in(
0, nexty - i)
("\033[7;31;40m檢測結果{}行{}列的位置與既有皇后中第{}行{}列位置的皇后衝突\033[0m"
.format
(nexty, nextx, i, state[i]))
return
true
("\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)
("\033[7;36;40m既有皇后位置為{},第{}行皇后的合法位置位於{}列\033[0m"
.format
(state,
len(state)
, pos))if
len(state)
== num -1:
("第0行至第{}行的皇后位置為{},最後一行皇后位置的橫座標為{}"
.format
(num -
2, state, pos)
)yield
(pos,
)else
("當前皇后位於第{}行,將進入下一輪遞迴"
.format
(len
(state)))
("下一輪遞迴中的已知既有皇后的位置為{}"
.format
(state +
(pos,))
)for result in queens(num, state +
(pos,))
("\033[7;44;40m既有皇后位置為{}\033[0m"
.format
(state +
(pos,))
("\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:
(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...