94. 递归实现排列型枚举
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了94. 递归实现排列型枚举相关的知识,希望对你有一定的参考价值。
94. 递归实现排列型枚举
老规矩先画递归树。
当 n=3 时
假如我们第一次选了 1 那么接下来的选只能从 2和3中选。
依次枚举每个位置放哪个数
代码实现部分,我们首先得有一个数组来保存我们的方案。
还得有一个数组来判断,选数的时候该数是不是在之前已经选走了。
#include<cstdio>
#include<iostream>
int state[10];//0代表还没有选数,1~n代表放了哪个数
bool m[10];//true表示用过,false表示没有用过
int n;
void dfs(int u)//第几个位置
{
if(u==n)
{
for(int i=0;i<n;i++)
{
printf("%d ",state[i]);
}
printf("\\n");
return;
}
for(int i=1;i<=n;i++)//枚举所有的数,看哪个可以选
{
if(!m[i])//该数没有被选
{
m[i]=true;//状态表示选了
state[u]=i;//选这该数
dfs(u+1);//开始选下一个位置
m[i]=false;//恢复现场
state[u]=0;//恢复现场
}
}
}
int main(void)
{
scanf("%d",&n);
dfs(0);
return 0;
}
可以用现有的函数实现全排列
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10]={1,2,3,4,5,6,7,8,9};
int main(void)
{
int n;
scanf("%d",&n);
do
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\\n");
}while(next_permutation(a,a+n));
return 0;
}
以上是关于94. 递归实现排列型枚举的主要内容,如果未能解决你的问题,请参考以下文章