题目描述
今有 �n 名学生,要从中选出 �k 人排成一列拍照。
请按字典序输出所有可能的排列方式。
输入格式
仅一行,两个正整数 �,�n,k。
输出格式
若干行,每行 �k 个正整数,表示一种可能的队伍顺序。
输入输出样例
输入 #1复制
3 2
输出 #1复制
1 2 1 3 2 1 2 3 3 1 3 2
#include <bits/stdc++.h>
using namespace std;
int a[10];
void print(int n){
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return;
}
void dfs(int x,int n,int m){
bool b[10]={};
if(x==m){//层数到边界,每种排列有m个数
print(m);
return;
}
for(int i=1;i<=n;i++){一共从n个数中选数
if(b[i]==1) continue;
int flag=0;
for(int j=0;j<x;j++)//判断没有重复的数
if(a[j]==i) flag=1;
if(flag) continue;
a[x]=i;
b[i]=1;
dfs(x+1,n,m);
a[x]=0;//回溯
b[i]=0;
}
}
int main()
{
int n,m;
cin>>n>>m;
dfs(0,n,m);
return 0;
}
这道题和全排列问题相似,都可以使用搜索回溯