回溯法 N皇后問題

2021-09-29 11:17:30 字數 1955 閱讀 5933

n 皇后問題研究的是如何將n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊

不能相互攻擊就是n個皇后兩兩不能同行同列同對角線

示例:

輸入: 4

輸出: [

[".q…", // 解法 1

「…q」,

「q…」,

「…q.」],

["…q.", // 解法 2

「q…」,

「…q」,

「.q…」]

]

解釋:4 皇后問題存在兩個不同的解法

可以利用 回溯法子集樹 模板進行求解,每個節點是n 分不是子集樹裡面的二分衝突檢測要注意,同行同列同對角線時剪枝

class

solution

:def

__init__

(self)

: self.x =

self.x =

self.n =

0def

conflict

(self, k)

:if k==0:

return

false

for i in

range

(k):

if self.x[i]

== self.x[k]

orabs

(i-k)

==abs

(self.x[i]

-self.x[k]):

return

true

return

false

defbacktrack

(self, k)

:if k>=self.n::]

)else

:for i in

range

(self.n):if

not self.conflict(k)

: self.backtrack(k+1)

self.x.pop(

)def

numlist2reslist

(self)

: res =[[

[0for i in

range

(self.n)

]for j in

range

(self.n)

]for k in

range

(len

(self.x))]

result =

for i in

range

(len

(self.x)):

for j in

range

(self.n)

:for k in

range

(self.n)

: res[i]

[j][k]

='q'

if self.x[i]

[j]== k else

'.'for i in

range

(len

(self.x)):

tmp =

for j in

range

(self.n):''

.join(res[i]

[j])):

])return result

defsolvenqueens

(self, n)

: self.n = n

self.backtrack(0)

return self.numlist2reslist(

)

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...

回溯法 n皇后問題

問題描述 在nxn的棋盤上,放置彼此不受攻擊的n個皇后。規則 皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。以行為主導 不用再判斷是否同行了 演算法設計 1 定義問題的解空間 問題解的形式為n元組 分量xi表示第i個皇后放置在第i行,第xi列。2 解空間的組織結構 m叉樹 3 搜尋解空間 約束...

回溯法 N皇后問題

一般是八皇后,首先是演算法思想如下 void generate int n else 回溯,取消占領.主函式如下 首先從0開始,也就是第一行開始逐級向下 int main else flag col true 回溯考慮上一層的情況,並且把這一層改過來的false改為true d1 n col 7 t...