對於一般的全排列問題,使用dfs遞迴方法即可:
n=int(input())view codel=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:
(l)
return
for i in
range(k,n):
swmp(l,k,i)
fun(l,k+1)
swmp(l,k,i)
fun(l,0)
但是可以看出,此全排列輸出並不是按字典序排列的:
[1, 2, 3, 4]output[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
如果要按照字典序排列進行輸出,那麼為了保持大小順序,不只是要調換兩個數的值,而是迴圈移動,**如下:
n=int(input())view codel=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:
(l)
return
for i in
range(k,n):
swmpgo(l,k,i)
fun(l,k+1)
swmpback(l,k,i)
fun(l,0)
此時,全排列的輸出是按照字典順序來的:
[1, 2, 3, 4]output[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]
全排列問題
一 全排列問題演算法描述如下 舉例 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,...