递归实现排列型枚举


题目

把 1~n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数n。
输出格式
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1≤n≤9
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

代码
#include<iostream>
using namespace std;

int vis[12];
int aa[12];
int n;

void dfs(int a)
{
    if(a>n)
    {
        for(int i=1;i<=n;i++) cout<<aa[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {//从1到n依次枚举
        if(!vis[i])
        {//如果之前没有用过就把aa[i]置为这个数
            aa[a]=i;
            vis[i]=1;//同时把这个数标记用过
            dfs(a+1);
            aa[a]=0;//递归之后恢复,重新置为0
            vis[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

也可以用next_permutation()函数

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[9]={1,2,3,4,5,6,7,8,9};
    int n;
    cin>>n;
    do{
        for(int i=0;i<n;i++) cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a,a+n));
    return 0;

}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
递归实现指数型枚举 递归实现指数型枚举
题目从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ
2020-02-23
Next 
翻硬币 翻硬币
题目小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:oo*oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已
2020-02-23
  TOC