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

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

    推荐阅读