题解 - 取数排列

题目描述

取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可组成的所有三位数为:

那么,输入编号M=2时,则输出132。

输入

包括两个数,即正整数N(1 <= N <= 9)和正整数M(1 <= M <= 362880)。

输出

只有一行,即与输入的编号M对应的那个N位数。

样例输入

3 2

样例输出 Copy

132

分析

N <= 9,所以可以直接将n全排列,时间复杂度为O(n!),9! = 362880,并且全排列的过程中是从1开始枚举到n,故满足从小到大的关系,即不需要再进行排序,总时间复杂度满足题目要求

全排列

cpp 复制代码
void dfs(int steps){
    if(steps == n + 1){
        tmp++; // tmp记录数量
        for(int i = 1;i <= n;i++) res[tmp][i] = path[i]; // res存储所有满足条件的情况
         
        return ;
    }
  
    for(int i = 1;i <= n;i++){
        if(!st[i]){
            st[i] = true;
            path[steps] = i;
            dfs(steps + 1);
            st[i] = false;
        }
    }
}

代码

cpp 复制代码
#include<bits/stdc++.h>
     
using namespace std;

const int N = 9 + 10,M = 362880 + 10;
 
int n,m;
int path[N];
bool st[N];
int tmp;
int res[M][N];
  
void dfs(int steps){
    if(steps == n + 1){
        tmp++;
        for(int i = 1;i <= n;i++) res[tmp][i] = path[i];
         
        return ;
    }
  
    for(int i = 1;i <= n;i++){
        if(!st[i]){
            st[i] = true;
            path[steps] = i;
            dfs(steps + 1);
            st[i] = false;
        }
    }
}
 
int main(){
    ios::sync_with_stdio;
    cin.tie(0),cout.tie(0);
 
    cin >> n >> m;
 
    dfs(1);
 
    for(int i = 1;i <= n;i++) cout << res[m][i];
 
    return 0;
}
相关推荐
java干货1 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟1 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒2 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex52 小时前
几种 dump hash 方式对比分析
算法·哈希算法
初願致夕霞2 小时前
Linux_进程
linux·c++
Thera7773 小时前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
Wei&Yan3 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
wregjru3 小时前
【QT】4.QWidget控件(2)
c++
浅念-3 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
小羊不会打字3 小时前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习