您的位置:首页 > 其它

蓝桥杯 算法提高 排列数

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:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: