新手入门—递归实现排列型枚举

分析

排列型枚举的意思是在范围内有多少种不同的排列方法,我们可以想一下组合型枚举,
组合型枚举相当于寻找元素个数为n的子集并且以升序的形式输出。所以同一种组合只
有一种表达形式,那么排列型枚举相当于将同一种组合以不同的排列顺序表现出来。
我们首先看一下组合型枚举的递归函数。

//我们逐行来进行分析
void dfs(int cur)
{
    if(cur == m + 1) {
        for(int i = 1; i <= m; ++i) cout << arr[i] << " ";//将元素组合输出
        puts("");
        return ;//返回上一次递归
    }
    for(int i = 1; i <= n; ++i) {
        if(vis[i] || i < arr[cur - 1]) continue;//判断语句i < arr[cur - 1]查看组合是否按照升序进行
        //判断语句vis[i]查看组合里的元素是否重合。
        arr[cur] = i; //选第i个数
        vis[i] = true;  
        dfs(cur + 1);
        vis[i] = false;  //恢复
    }
}

而排列型枚举不要求升序排列(也不可能要求升序排列,升序排列只有一种情况)所以我们不需
要i < arr[cur - 1]这条判断语句,但是防止重复需要vis[i]语句。而且输出个数也要改变,
只需改成n即可。

代码

#include <bits/stdc++.h>
using namespace std;

int n;
int arr[30];
bool vis[30];
void dfs(int cur)
{
    if(cur == n + 1) {
        for(int i = 1; i <= n; ++i) cout << arr[i] << " ";
        puts("");
        return;
    }
    for(int i = 1; i <= n; ++i) {
        if(vis[i]) continue;
        arr[cur] = i;
        vis[i] = true;
        dfs(cur + 1);
        vis[i] = false; 
    }
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43064070/article/details/87381666