南阳oj D的小L

1、题目信息:

D的小L

时间限制: 4000 ms  |  内存限制: 65535 KB
难度: 2


描述

      一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?

输入

第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)

输出

    按特定顺序输出所有组合。

    特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。

样例输入      

2
2
3

样例输出

12
21
123
132
213
231
312
321

2、思路

    通过题给信息可到这是一个求全排列的问题(按字典顺序):

    方式(1)使用C++的STL中next_permutation()函数:给出序列在全排列中的下一个序列

    方式(2)使用递归来做:

        把问题“求1~n的全排列”分解成求“以1开头的全排列”、“以2开头的全排列”……。使用数组p来存放当前排列,数组h来判断对应整数i是否在数组p中,如果在h[i]=1,不在h[i]=0。

        按顺序往数组p中填入数字。每填一个就遍历1-n,只要h[index]=0,就可以填入,填入后h[index]=0,依次递归。当地递归结束后,h[index]=0

3、代码

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

int main()
{
    int N,a[10]={0};
    cin>>N;
    while (N--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            a[i]=i+1;
        }
        do{
            for(int i=0;i<n;i++)
                cout<<a[i];
            cout<<endl;
        }while (next_permutation(a, a+n));
    }
    return 0;
}

递归方式:

#include <stdio.h>
#define MaxSize 10
int n,x,p[MaxSize],hashMap[MaxSize]={0};
void allSort(int index){
    if(index==x+1){
        for(int i=1;i<=x;i++){
            printf("%d",p[i]);
        }
        printf("\n");
        return;
    }

    for(int i=1;i<=x;i++){
        if(hashMap[i]==0){
            p[index]=i;
            hashMap[i]=1;
            allSort(index+1);
            hashMap[i]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%d",&x);
        allSort(1);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/sicauliuy/article/details/80145801