天天看点

C++/python描述 AcWing 94. 递归实现排列型枚举

C++/python描述 AcWing 94. 递归实现排列型枚举

把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 n。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行相邻两个数用一个空格隔开。

数据范围

输入样例:

3      

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1      

算法实现一 C++

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,res[10] = {0};
    cin >> n ;
    for(int i = 0 ; i < n; i++) res[i] = i+1;
    do{
        for(int i = 0 ; i < n ;i++)
            cout<<res[i] <<" ";
        cout<<endl;
    }while(next_permutation(res,res+n));
    return 0;
}      

算法实现二 C++

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,res[10] = {0},m=1;
    cin >> n ;
    for(int i = 0; i < n; i++) res[i] = i+1;
    for(int i = 1; i <= n; i++) m *= i;
    for(int i = 0 ; i < n ;i++)
            cout<<res[i] <<" ";
        cout<<endl;
    m--;
    while(m--){
        int i = n-1;
        while(i && res[i] < res[i-1]) i--;
        int j = i;
        while(j + 1 < n && res[j+1] > res[i-1]) j++;
        swap(res[i-1],res[j]);
        reverse(res+i,res+n);
        for(int i = 0 ; i < n ;i++)
            cout<<res[i] <<" ";
        cout<<endl;
    }
    return 0;
}      

算法实现三 Python

from itertools import permutations
n = int(input())
res = [i+1 for i in range(n)]
for item in permutations(res):
    for d in item:
        print(d,end=' ')
    print('')      

算法实现四 Python

from itertools import permutations
n = int(input())
res = [i+1 for i in range(n)]
m = 1
for i in range(n):
    m *= (i+1)
for item in res:
    print(item,end=' ')
print(' ')
m -= 1
while m:
    i = n - 1
    while n > 0 and res[i] < res[i-1]:
        i -= 1
    j = i
    while j+1 < n and res[i-1] < res[j+1]:
        j += 1
    res[i-1],res[j] = res[j],res[i-1]
    res[i:] = reversed(res[i:])
    for item in res:
        print(item,end=' ')
    print('')
    m -= 1