全排列問題

2022-10-08 16:12:15 字數 1938 閱讀 2680

對於一般的全排列問題,使用dfs遞迴方法即可:

n=int(input())

l=for i in range(1,n+1):

defswmp(l,i,j):

l[i],l[j]=l[j],l[i]

deffun(l,k):

if k==n-1:

print

(l)

return

for i in

range(k,n):

swmp(l,k,i)

fun(l,k+1)

swmp(l,k,i)

fun(l,0)

view code

但是可以看出,此全排列輸出並不是按字典序排列的:

[1, 2, 3, 4]

[1, 2, 4, 3]

[1, 3, 2, 4]

[1, 3, 4, 2]

[1, 4, 3, 2]

[1, 4, 2, 3]

[2, 1, 3, 4]

[2, 1, 4, 3]

[2, 3, 1, 4]

[2, 3, 4, 1]

[2, 4, 3, 1]

[2, 4, 1, 3]

[3, 2, 1, 4]

[3, 2, 4, 1]

[3, 1, 2, 4]

[3, 1, 4, 2]

[3, 4, 1, 2]

[3, 4, 2, 1]

[4, 2, 3, 1]

[4, 2, 1, 3]

[4, 3, 2, 1]

[4, 3, 1, 2]

[4, 1, 3, 2]

[4, 1, 2, 3

output

如果要按照字典序排列進行輸出,那麼為了保持大小順序,不只是要調換兩個數的值,而是迴圈移動,**如下:

n=int(input())

l=for i in range(1,n+1):

defswmpgo(l,i,j):

for x in range(j,i,-1):

l[x-1],l[x]=l[x],l[x-1]

defswmpback(l,i,j):

for x in

range(i,j):

l[x],l[x+1]=l[x+1],l[x]

deffun(l,k):

if k==n-1:

print

(l)

return

for i in

range(k,n):

swmpgo(l,k,i)

fun(l,k+1)

swmpback(l,k,i)

fun(l,0)

view code

此時,全排列的輸出是按照字典順序來的:

[1, 2, 3, 4]

[1, 2, 4, 3]

[1, 3, 2, 4]

[1, 3, 4, 2]

[1, 4, 2, 3]

[1, 4, 3, 2]

[2, 1, 3, 4]

[2, 1, 4, 3]

[2, 3, 1, 4]

[2, 3, 4, 1]

[2, 4, 1, 3]

[2, 4, 3, 1]

[3, 1, 2, 4]

[3, 1, 4, 2]

[3, 2, 1, 4]

[3, 2, 4, 1]

[3, 4, 1, 2]

[3, 4, 2, 1]

[4, 1, 2, 3]

[4, 1, 3, 2]

[4, 2, 1, 3]

[4, 2, 3, 1]

[4, 3, 1, 2]

[4, 3, 2, 1]

output

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...

全排列問題

全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...