NOIP學習之遞迴 188 全排列

2021-10-04 16:22:09 字數 1240 閱讀 9552

測試鏈結

總時間限制: 1000ms 記憶體限制: 65536kb

描述

給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有』a』 < 『b』 < … < 『y』 < 『z』,而且給定的字串中的字母已經按照從小到大的順序排列。

輸入

輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。

輸出

輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。字母序如下定義:

已知s = s1s2…sk , t = t1t2…tk,則s < t 等價於,存在p (1 <= p <= k),使得

s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。

樣例輸入

abc樣例輸出

abcacb

bacbca

cabcba

解題思路:

1.這道全排列題特別好去理解遞迴呼叫,也就是遞和歸2條路徑,以abc為例,首先是將輸入字串和輸出字串做分離,我覺得不用字元交換更利於理解這道題,也就是說輸出字元的字母順序始終變化,而輸入字元保持不變;

2.先輸出abc,將被遞迴進的2個b和c回溯,a位置不動,根據返回順序,有的像堆疊,先進後出c和b進行交換,再進行回溯,這時候回溯包括第乙個字元a

3.這時候再對a下面字元進行排列,也就是b,而b的位置要放到第乙個字元,a經過遞迴放在第二個字元位置,輸出bac;

4.再進行回溯,對a和c進行排列,輸出bca;

5,在進行回溯,輸出cab,再回溯,

6,輸出cba;

此題關鍵是要鎖定首字元,對其他字元進行排序,而首字元是再不斷變化,但位置不變,定在第乙個位置,而其他字元排列就正好使用遞迴去解決,也就是遞迴思想,f(n)可以用f(n-1)去實現

#include

#include

using

namespace std;

char str[8]

,ans[8]

;int len,lock[8]

;void

arrange

(int point)

for(

int i=

0;i}int

main()

return0;

}

遞迴之全排列問題

一 問題 設計乙個遞迴演算法生成n個元素的全排列。二 思路 其實就是將整個序列a 的每個元素一一提到序列a首個位置即a i 三 include using namespace std void swap int a,int b list k m 的所有排列,k是序列首下標,m是序列最後乙個下標 vo...

遞迴之全排列演算法

假設有這樣乙個序列,找出這個序列的所有全排列。第一位有 n 種可能性,確定了第一位後就是求解剩下 n 1 個資料的排列問題,這樣就可以往下一直分解問題,直到序列結尾處,也就是終止條件。1 2 3 2 1 3 3 2 1 暫不考慮序列元素重複問題,測試序列 include using namespac...

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...