python全排列解決八皇后問題

2021-09-20 18:39:12 字數 1314 閱讀 8584

八皇后問題是指8x8的西洋棋棋盤上,如何放置8個皇后,使得任意兩個皇后不會互相攻擊。算上對稱解的話,八皇后問題有91個解(當然,我們習慣從0開始計數)。

不難想到,用(0,1,2,3,4,5,6,7)八個數字組成個tuple,其中數字所在位置代表了行,數字本身代表了列,則任意乙個排列即代表一種放置方法,使得任意兩個皇后不會同行或同列,只需檢查是否存在對角線衝突,若正反對角線都不衝突(任意兩皇后之間座標之和不相等,座標之差不相等),此放置即為乙個解。

利用python的itertools生成全排列進行迭代,解法非常容易理解,**可以寫的很簡潔,不包括列印輸出**的話不到十行。

生成全排列,遍歷之如果不衝突即為解之一,輸出

from itertools import permutations

# 檢查排列x是否存在衝突,無衝突返回true

defcheck

(x):

for i in

range

(len

(x)-1)

:for k in

range

(i +1,

len(x)):

if i + x[i]

== k + x[k]

or i - x[i]

== k - x[k]

:return

false

return

true

# 列印棋盤和排列x的皇后位置

defprint_queen

(x):

n =len(x)

for i in

range

(n):

print

((x[i])*

'□'+

'o'+

(n - x[i]-1

)*'□')

print()

solutions =

0# 產生皇后位置的全排列,檢查無衝突即為乙個解

for x in permutations(

range(8

)):if check(x)

:print

(solutions, x)

print_queen(x)

solutions +=

1

91 (7, 3, 0, 2, 5, 1, 6, 4)

□□□□□□□o

□□□o□□□□

o□□□□□□□

□□o□□□□□

□□□□□o□□

□o□□□□□□

□□□□□□o□

□□□□o□□□

八皇后 全排列 C語言

問題描述 在乙個8 8的西洋棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列和同一斜線上,問有多少種擺法。思路 因為每行 每列都只能有乙個皇后,因此可以按照行來看,對每行皇后所在的列做乙個標記。每個後可以按照行來看,那麼每個列數可以看作乙個全排列。上圖所表示的全排列為 6...

八皇后問題 之全排列解法

問題的分解一共有兩步 1.生成問題的所有候選解空間 2.過濾掉那些不滿足要求的細化這兩步,需要認識到下面兩點 1.八皇后所有候選解空間是 1,2,3,4,5,6,7,8 這個集合中元素的全排列 這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫 豎方向上攻擊的問題 2.接下來八皇后相互攻擊的問題...

全排列問題和八皇后問題

全排列問題的解法如下 include const int maxn 11 int n,p maxn hashtable maxn void generatep int index printf n return for int x 1 x n x int main 解析如下 取自 演算法筆記 運用這...