n个数中取r个数的全排列——【S神】苏嘉亿
说到排列组合问题,至今还让大家耳目一新记忆犹新釜底抽薪的题目有:全排列啊、组合的输出啊等等等等;今天就让我们来探索一下入门后,继全排列后排列组合第二关————n个数中取r个数的全排列
题目分析:先把排列模板打好:
#include
using namespace std;
int vis[20];
int ans[20];
int n;
void dfs(int t){
if(t>n){
for(int i=1;
i<=n;
i++){
printf("%d",ans[i]);
}
printf("\n");
return;
}
for(int i=1;
i<=n;
i++){
if(!vis[i]){
ans[t]=i;
vis[i]=1;
dfs(t+1);
vis[i]=0;
}
}
}int main(){
scanf("%d",&n);
int x=1;
for(int i=n;
i>0;
i--){
x*=i;
}
printf("%d\n",x);
dfs(1);
return 0;
}//因为我是新手,不会在这里面打缩进,所以就将就吧,请大神教下小弟
这道题不就是比全排列多了一个r范围吗,在原代码上修改:
#include
using namespace std;
int a[15],ans=0,n,r;
bool vis[15];
void print(){
ans++;
for(int i=1;
i<=r-1;
i++){
printf("%d ",a[i]);
}
printf("%d\n",a[r]);
}void dfs(int len){
for(int i=1;
i<=n;
i++){
if(!vis[i]){
a[len]=i;
vis[i]=1;
if(len==r){
print();
}
else{
dfs(len+1);
}
vis[i]=0;
}
}
}int main(){
scanf("%d %d",&n,&r);
dfs(1);
printf("%d",ans);
return 0;
}
突然想起什么!
题目忘加了!
不慌,补上:
问题 A: n个数中取r个数的全排列
时间限制: 1 Sec
内存限制: 128 MB
提交: 145 解决: 109
【n个数中取r个数的全排列——【S神】苏嘉亿】题目描述:
设n个整数的集合{1,2,3,n},从中取出r个进行排序,输出排序结果。
输入一行:两个正整数 n 和 r (r
样例输入
3 2
样例输出
1 2
1 3
2 1
2 3
3 1
3 2
6
最后问一下:你听懂了吗?求给个赞!!!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量