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; }