一、问题描述
设计一个算法求 1~n 的 n 个整数 中取出 m 个整数的全排列,要求在每个排列中每个整数只能取一次。
二、算法分析
直接使用深搜,个数满足了m就输出即可
#include<iostream>
using namespace std;
int a[100],vis[100];
int n,m;
void dfs(int cur,int m){
if(cur==m + 1){ //递归边界,说明填完了,不能是m,因为如果是m进入下一层dfs是提前加一的,等于说是你第三个数还没放进a数组就输出,会出现0
for(int i=1;i<=m;i++) //一个一个的输出
cout<<a[i]<<" ";
cout<<endl;
}
for(int i=1;i<=n;i++){ //把数字1-n填入
if(!vis[i]){
a[cur] = i;
vis[i] = 1;//这位数字被使用过
dfs(cur + 1,m);
vis[i] = 0;//回溯
}
}
}
int main()
{
cout<<"请依次输入n和m"
cin>>n>>m;
dfs(1,m);
return 0;
}