PTA 输出全排列

266 阅读1分钟

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。

输入格式:

输入给出正整数n(<10)。

输出格式:

输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,,ana_1,a_2,⋯,a_n排在序列b1,b2,,bnb_1,b_2,⋯,b_n之前,如果存在k使得a1=b1,,ak=bk 并且 ak+1<bk+1a_1=b_1,⋯,a_k=b_k 并且 a{k+1}<b_{k+1}

输入样例:

3
结尾无空行

输出样例:

123
132
213
231
312
321
结尾无空行

代码1:

# include <iostream>
# include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n ;
    string a;
    for( int i = 1 ; i <= n ; i ++ )
    {
        a += i+'0';
    }
    do{
        cout << a << endl;
    }while(next_permutation(a.begin(),a.end())); //使用全排列函数
    return 0;
}

提交结果1:

6.1.png

代码2:

#include <iostream>
using namespace std;
const int maxn = 1010;
int num[maxn];
void print_per(int n,int *A,int cur)
{
    if(cur==n)
    {
        for(int i=0;i<n;i++)
            cout << A[i];
        cout << endl ;
    }
    else
    for(int i=1;i<=n;i++)
    {
        int ok = 1;
        for(int j=0;j<cur;j++)
        {
            if(A[j]==i) ok=0;
        }
        if(ok)
        {
            A[cur]=i;
            print_per(n,A,cur+1);
        }
    }
}
int main()
{
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
        num[i] = i+1;
    print_per(n,num,0);
}

提交结果2: