首页 > 代码库 > 温习全排列
温习全排列
全排列
题目:
找出从自然数1,2,…… n中任取r个数的组合。
比如n=5,r=3。
可用这种递归思想来考虑组合函数的算法,设子程序[计算分组子程序(m,k)] ,即找出自然数1。2……m中任取k个数的全部组合。当组合的第一个数字选定时,其后面的数字是从余下的m-1个数中取k-1个数的全部组合。
比如 n=3,r=2。
12 21 13 31 23 32
比如 n=3 r=3;
123 132 213 232 312 321
题解:从序号1选择,一直到序号r。
每一个序号有n种选择(排除已经选择过的)。这道题目就是dfs加上回溯
关键代码:
void DFS(int y,int temp[])//y为已经选择到了的序号。temp数组用来存储选好的数据
{
if(y>r)return ;
if(y==r)//选完了,进行输出
{
for(int i=0;i<r;i++){
printf("%d",temp[i]);
}
printf("\n");
return ;
}else{
int u;
for(int i=0;i<n;i++)//进行选择
{
if(a[i]==0)continue;//0为已经选择的意思
else{
u=a[i];
temp[y]=a[i];
a[i]=0;
DFS(y+1,temp);//回溯
a[i]=u;
temp[y]=0;
}
}
}
}
全然代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,r,a[9];
void DFS(int y,int temp[]){
if(y>r)return ;
if(y==r){
for(int i=0;i<r;i++){
printf("%d",temp[i]);
}
printf("\n");
return ;
}else{
int u;
for(int i=0;i<n;i++){
if(a[i]==0)continue;
else{
u=a[i];
temp[y]=a[i];
a[i]=0;
DFS(y+1,temp);
a[i]=u;
temp[y]=0;
}
}
}
}
int main()
{
int temp[9];
scanf("%d%d",&n,&r);
for(int i=0;i<n;i++) a[i]=i+1;
DFS(0,temp);
}
温习全排列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。