递归实现排列型枚举

题目描述

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

 

输入

一个整数n。

 

输出

按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

 

样例输入

3

样例输出

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

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int num[20],n;
void init(){
    fill(num,0);
    cin>>n;
}
void solve(int n,int ans){
    if(ans==n)range(i,0,n-1)cout<<num[i]<<(i==n-1?'\n':' ');
    else range(i,1,n){
        bool flag=true;
        range(j,0,ans-1)if(num[j]==i)flag=false;
        if(flag){
            num[ans]=i;
            solve(n,ans+1);
        }
    }
}
int main() {
    init();
    solve(n,0);
    return 0;
}
View Code

 

posted @ 2018-07-17 00:51  RhythmLian  阅读(742)  评论(0编辑  收藏  举报