n个数中取r个数的全排列

说到排列组合问题,至今还让大家耳目一新记忆犹新釜底抽薪的题目有:全排列啊、组合的输出啊等等等等;今天就让我们来探索一下入门后,继全排列后排列组合第二关————n个数中取r个数的全排列

题目分析:先把排列模板打好:

#include<bits/stdc++.h>
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<bits/stdc++.h>
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个整数的集合{1,2,3,n},从中取出r个进行排序,输出排序结果。

输入一行:两个正整数 n 和 r (r<n<10)。
输出字典序从小到大的全排列及全排列的总个数。

样例输入

3 2

样例输出

1 2
1 3
2 1
2 3
3 1
3 2
6

最后问一下:你听懂了吗?求给个赞!!!

发布了4 篇原创文章 · 获赞 4 · 访问量 29

猜你喜欢

转载自blog.csdn.net/Harden13MVP/article/details/104352921