每日一题——递归实现排列型枚举

题目

递归实现排列型枚举

题解

这道题其实就是求无重复元素的全排列问题,递归一般注意截止条件,这里的截止条件一定是全部遍历完了,因为顺序是乱的,所以我们应该不止拿个数组存储是否使用,还需要拿个数组存储路径,遍历一遍如果没被使用可以选择,然后进行下一个数的选择,此时dfs里面的参数u表示的是当前选了几个数而不是数字几。

参考代码(老实本分型)

#include<iostream>
using namespace std;
const int N = 20;
int n;
int path[N];
bool st[N];
void dfs(int u){
    if( u == n + 1){
        for(int i = 1; i <= n; i ++){
            cout << path[i] << " ";
        }
        puts("");
        return;
    }
        
    for(int i = 1;i <= n; i ++){
        if(!st[i]){
            path[u] = i;
            st[i] = true;
            dfs(u + 1);
            st[i] = false;
        }
    }
}
int main(){
    cin >> n;
    dfs(1);
    return 0;
}

参考代码(作弊型)

//我不会告诉你c++库中有脏东西,C++STL中全排列函数next_permutation,详情可以自己百度。
#include <bits/stdc++.h>
using namespace std;
const int N=11;
int n,a[N];
int main() 
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        a[i]=i;
    do
    {
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a+1,a+1+n));
    return 0;
}
posted @ 2025-03-05 19:38  PZnwbh  阅读(11)  评论(0)    收藏  举报