考慮 n=3
n=3n=
3 ,代表了有 a,b
,ca, \ b,\ c
a,b,
c 三個空位置和寫有 1,2
,31,\ 2, \ 3
1,2,
3 的卡片,我們需要將卡片放到空位置上,並且每個位置只能放一張卡片,現在我們需要找出這 3
33 張卡片的所有不同擺放方法。
在某乙個位置,考慮應該先放哪張卡片的時候,我們可以約定乙個先後順序 1→2
→31 \rightarrow 2 \rightarrow 3
1→2→3。
根據約定順序放置卡片,首先可以得到:a(1
)a(1)
a(1)
,b (2
)b(2)
b(2)
,c (3
)c(3)
c(3)
,這時我們已經得到了一種全排列 (1,
2,3)
(1, 2, 3)
(1,2,3
)。而現在我們實際上已經走到了乙個並不存在的位置d(即結束位置,但是我們排列並沒有結束)。
現在我們需要立即回到位置 c
cc,取回卡片 3
33,然後嘗試是否還能放入其它卡片(當然是按照我們的約定順序),結果顯然是我們手裡並沒有其它可以放入的卡片。
所以,我們需要繼續回退一步來到位置 b
bb,取出卡片 2
22,然後繼續嘗試是否能放入其它卡片(當然是按照我們的約定順序),這時我們發現可以放入卡片 3
33;放入卡片 3
33 後,我們向前一步來到位置 c
cc,嘗試放入卡片(當然是按照我們的約定順序),這時我們發現可以放入卡片 2
22;放完卡片 2
22,我們繼續向前一步來到了並不存在的位置 d
dd;這時我們得到了另一種全排 (1,
3,2)
(1, 3, 2)
(1,3,2
);按照上述步驟重複下去,就可以得到所有的全排列。
補充:如果要求結果是遞增輸出,在下面**上加一句**i > ans[x]
即可(剪枝)。
#include
#include
#include
#include
using namespace std;
int ans[11]
;bool vis[11]
;int n;
void
dfs(
int x)
cout<
return
;//需要回退到呼叫處
}for
(int i =
1; i <= n; i++
)//有1~n個數(卡片)可選}}
intmain()
codeup 問題 A 遞迴入門 全排列
題目描述 排列與組合是常用的數學方法。先給乙個正整數 1 n 10 例如n 3,所有組合,並且按字典序輸出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 輸入 輸入乙個整數n 1 n 10 輸出 輸出所有全排列 每個全排列一行,相鄰兩個數用空格隔開 最後乙個數後面沒有空格 ...
Codeup 604 問題 B 全排列
給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。...
問題 A 遞迴入門 全排列
問題 a 遞迴入門 全排列 時間限制 1 sec 記憶體限制 128 mb 提交 1502 解決 955 提交 狀態 討論版 命題人 外部匯入 題目描述 排列與組合是常用的數學方法。先給乙個正整數 1 n 10 例如n 3,所有組合,並且按字典序輸出 1 2 3 1 3 2 2 1 3 2 3 1 ...