题目描述
从n个当中选m个,有多少种排列呢? 请全输出
输入格式
输入n,m(1≤m≤n≤5)
输出格式
所有可能的排列,字典序
输入输出样例
输入 #1复制
3 2
输出 #1复制
12
13
21
23
31
32
本蒟蒻算法:递归模拟多重循环
这是NOI/NOIP选手必备知识点之一
其实递归重在函数(特别是检查函数),所以想学好这个,先得学好自定义函数。
先写检查函数:
bool check(){
for(int i=1;i<p;++i){
for(int j=i+1;j<=p;++j)
if(b[i]==b[j])
return false;
}
return true;
}
在写递归函数:
void dfs(int dep){
if(dep>p){
if(check()){
for(int i=1;i<=p;i++)
cout<<b[i];
cout<<endl;
}
return;
}
for(int i=1;i<=n;i++){
b[dep]=i;
dfs(dep+1);
}
}
寥寥几笔写完主程序:
cin>>n>>p;
dfs(1);
再来一个超赛亚人合体:
#include<bits/stdc++.h>
using namespace std;
long long n,p,b[6];
bool check(){
for(int i=1;i<p;++i){
for(int j=i+1;j<=p;++j)
if(b[i]==b[j])
return false;
}
return true;
}
void dfs(int dep){
if(dep>p){
if(check()){
for(int i=1;i<=p;i++)
cout<<b[i];
cout<<endl;
}
return;
}
for(int i=1;i<=n;i++){
b[dep]=i;
dfs(dep+1);
}
}
int main(){
cin>>n>>p;
dfs(1);
return 0;
}
Tip:
代码已AC