递归实现排列型枚举

题目:

递归实现排列型枚举_第1张图片

代码:

#include
#include
#include
#include
using namespace std;
const int N=10;
int n,s[N];   //s[]表示当前数的状态,0表示还没放数,1~n表示放了哪个数
bool u[N];    //u[]表示数是否被用过,true表示用过,false 表示还未用过
void d(int x)
{
    if(x>n){  //枚举到最后一位,边界
        for(int i=1;i<=n;i++) printf("%d ",s[i]);
        puts("");
        return;
    }
    
    //枚举分支,即当前位置可以填哪些数
    for(int i=1;i<=n;i++){
        if(!u[i]){   //没有被用过
            s[x]=i;
            u[i]=true;
            d(x+1);  //递归到分支去处理
            //s[x]=0;  //恢复现场
            u[i]=false;  //恢复现场
        }
    }
}
int main()
{
    cin>>n;
    d(1);
    return 0;
}

你可能感兴趣的:(蓝桥杯——递归与递推,蓝桥杯,c++)