蓝桥杯 算法提高 排列数
2018-01-16 20:53
363 查看
问题描述
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入一个数n
求0~9十个数的全排列中的第n个(第1个为0123456789)。
输入格式
一行,包含一个整数n
输出格式
一行,包含一组10个数字的全排列
样例输入
1
样例输出
0123456789
数据规模和约定
0 < n <= 10!
思路:这里可以采用c++标准函数库里的next_permutation(num,num+x)全排列函数(注意循环的次数n-1)
其头文件为<algorithm>。
不采用函数,采用枚举的方法则可以用DFS算法,将0~9看做两两互相连通的点,采用DFS从0开始深度优先遍历。即可枚举出所有的排列组合。
#C++STL:
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入一个数n
求0~9十个数的全排列中的第n个(第1个为0123456789)。
输入格式
一行,包含一个整数n
输出格式
一行,包含一组10个数字的全排列
样例输入
1
样例输出
0123456789
数据规模和约定
0 < n <= 10!
思路:这里可以采用c++标准函数库里的next_permutation(num,num+x)全排列函数(注意循环的次数n-1)
其头文件为<algorithm>。
不采用函数,采用枚举的方法则可以用DFS算法,将0~9看做两两互相连通的点,采用DFS从0开始深度优先遍历。即可枚举出所有的排列组合。
#C++STL:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int main() { int num[10]; long long n; scanf("%lld",&n); for(int i=0;i<10;i++) num[i]=i; for(int i=1;i<n;i++) next_permutation(num,num+10); for(int i=0;i<10;i++) printf("%d",num[i]); printf("\n"); return 0; }#DFS枚举算法:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int num[10],vis[10]; long long sum,n; void DFS(int cnt) { if(cnt==10) { sum++; if(sum==n) { for(int i=0;i<10;i++) printf("%d",num[i]); printf("\n"); } } else { for(int i=0;i<10;i++) { if(!vis[i]) { num[cnt]=i; vis[i]=1; DFS(cnt+1); vis[i]=0; } } } } int main() { scanf("%lld",&n); memset(vis,0,sizeof(vis)); DFS(0); return 0; }
相关文章推荐
- 蓝桥杯 算法提高 逆序排列
- 蓝桥杯算法提高 逆序排列
- 蓝桥杯 算法提高 逆序排列
- 蓝桥杯_算法提高 排列数
- 蓝桥杯 ADV-103算法提高 逆序排列
- 蓝桥杯- 算法提高 逆序排列
- 蓝桥杯 - 算法提高 排列数 【STL-next_permutation求全排列】
- 算法-蓝桥杯-算法提高 逆序排列(JAVA)
- 蓝桥杯 ADV-103 算法提高 逆序排列
- 蓝桥杯 ADV-103 算法提高 逆序排列
- 蓝桥杯 算法提高 8-1因式分解(Java解题)
- 蓝桥杯算法提高 矩阵乘法
- 蓝桥杯ADV-101——算法提高 断案
- 蓝桥杯ADV-83——算法提高 寻找三位数
- 蓝桥杯 算法提高 三位数进制和
- 蓝桥杯 算法提高 8-1因式分解
- 蓝桥杯 算法提高 合并石子 (dp)
- 蓝桥杯 算法提高 色盲的民主
- 蓝桥杯 ADV-108算法提高 分数统计
- 蓝桥杯 ADV-146算法提高 计算器