Codeup 問題 A 全排列(入門)

2021-09-11 21:28:15 字數 1525 閱讀 7967

考慮 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 ...