從排列組合到N皇后問題

2021-08-18 17:45:46 字數 2161 閱讀 1793

有了大概的思路後,具體的**如下:

class

solution:

defpermutation

(self, ss):

ifnot ss:

return

if len(ss) == 1:

return [ss]

l_ss = list(ss)

l_ss.sort() # 按字典的順序進行排序

res = # 返回的所有組合

for i in range(len(ss)): # 迴圈一次,相當於交換第乙個元素一次

if i > 0

and l_ss[i] == l_ss[i-1]: # 存在相鄰的多個元素重複時

continue

temps = self.permutation(''.join(l_ss[:i]) + ''.join(l_ss[i+1:])) # 遞迴除去i的其他組合

for j in temps:

return res

排列組合問題求解關於該排列組合的問題的拓展形式有很多,例如下面這種:

**實現如下:

def

groupall

(ss):

ifnot ss:

return

if len(ss) == 1:

return [ss]

l_ss = list(ss)

l_ss.sort()

res =

for i in range(len(ss)):

if i > 0

and l_ss[i] == l_ss[i-1]:

continue

temps = groupall(''.join(l_ss[i+1:])) # 只對i後面的進行遞迴

for j in temps:

res = list(set(res)) # 去除重複的

res.sort()

return res

上面的**是針對字串的,稍做簡單的修改就可以實現對數字的排列組合。見**:

def

group_array

(self, array):

ifnot array:

return

if len(array) == 1:

return [array]

res =

for i in range(len(array)):

if i > 0

and array[i] == array[i - 1]:

continue

temps = group_array(array[0:i] + array[i+1:])

for j in temps:

return res

n後問題的最主要的工作就剩下判斷是否是在對角線上。這個很簡單,給陣列設定兩個指標i, j,如果i-j==array[i]-array[j]或者j-i==array[i]-array[j],說明在對角線上。

def

n_queen

(columns):

res = group_array(columns) # 全排列

count = 0

for column in res:

check = true

# 判斷是否滿足條件

for i in range(len(column)):

for j in range(i + 1, len(column)):

if i - j == column[i] - column[j] or i - j == column[j] - column[i]:

check = false

if check: # 滿足條件

count += 1

print(len(res))

return count

執行上述**,會發現對於n=8的時候,共有40320種組合。其中,滿足要求的,即n=8的皇后問題的解共有92個。

排列組合問題

若有一串字母abc,進行全排列,有六種方法,3的階層,321,為什麼是這樣呢,我們根據 看思路 這之間會涉及遞迴,回溯 將abc看成陣列,a 0 a,a 1 b,a 2 c 下文中用a0代替a,a1代替b,a2代替c 排列的過程就是交換位置的過程 1 先對a進行交換 即k 0時 a0和a0自己交換 ...

排列組合問題

基本的排列組合問題,就是高中數學的內容,怎麼用程式語言輸出所有排列呢?我們手寫的過程,它應該是乙個遞迴的過程,而不適合用for wihle迴圈。如果資料結構學的紮實,可以發現這是乙個樹結構,遍歷所有的葉子節點就能夠得到全排列。說到遞迴,應該向大家隆重介紹一下數學歸納法的思想,應為都有乙個問題規模n。...

排列組合問題

這資料寫個暴力都拿不了30分 t t。c n,i c n,i c n,i c n,n i 結合現實意義,在n個裡面選 i 個,再在n個裡面選n i個的方案數。就等價於在前n個中選 i 個,在後n各種選n i個。而且i 0 n 在2 n各種選n個。那麼 c 2 n,n 答案要對1000000007取模...