def swap(num, i, j):
for x in range(j, i, -1):
tmp = num[x]
num[x] = num[x-1]
num[x-1] = tmp
def swapback(num, i, j):
for x in range(i, j):
tmp = num[x]
num[x] = num[x+1]
num[x+1] = tmp
def permutation(numbers, start):
if start == len(numbers) - 1:
print(" ".join(numbers))
else:
for i in range(start, len(numbers)):
swap(numbers, start, i)
permutation(numbers, start + 1)
swapback(numbers, start, i)
def func():
num = int(input())
numbers =
for i in range(1, num + 1):
permutation(numbers, 0)
if __name__ == "__main__":
func()
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
遞迴實現全排列的同時,需要保證能夠按照字典序輸出。
起始列表按序儲存,在調換位置時,將要調換的值從後往前迴圈移到start位置而非直接交換兩個點的位置,保證後半部分數值能保持大小順序。
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
全排列(按字典序)
描述 給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小...
全排列 字典序排列
include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...
字典序全排列
思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...