Swap Digits

题目描述#

一个十进制整数n,你最多可以任意交换相邻的两个数码k次,请问能得到多少个不同的无前导0的数?

输入#

第一行是一个整数T。 以后每行一个样例,为两个整数n,k。

输出#

每行输出一个样例的结果。

样例输入#

复制代码
2 
10 1 
123 2

样例输出#

复制代码
1
5

样例解释#

第一个样例只能得到10;第二个样例可以得到123,132,231,213,312。

解题思路

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node{
    long long num;
    int steps;
}Node;
#define MAX_QUEUE 100010
Node queue[MAX_QUEUE];
int front,rear;
#define MAX_HASH 100010
long long hash_set[MAX_HASH];
int hash_size;
int in_hash(long long num){
    for(int i=0;i<hash_size;i++){
        if(hash_set[i]==num){
            return 1;
        }
    }
    return 0;
}
void add_hash(long long num){
    if(!in_hash(num)){
        hash_set[hash_size++]=num;
    }
}
int get_digits(long long n){
    if(n==0) return 1;
    int count=0;
    while(n>0){
        count++;
        n/=10;
    }
    return count;
}
long long swap_digits(long long n,int i,int m){
    long long upp=100;
    long long low=1;
    for(int j=0;j<i;j++){
        upp*=10;
        low*=10;
    }
    long long a=n/upp;
    long long c=n%low;
    long long b=(n/low)%100;
    if(i==m-2 && (b%10==0)){
        return -1;
    }
    b=(b%10)*10+(b/10);
    long long x=a*upp+b*low+c;
    return x;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        long long n;
        int k;
        scanf("%lld %d",&n,&k);
        front = rear = 0;
        hash_size = 0;
        queue[rear].num = n;
        queue[rear].steps = 0;
        rear++;
        add_hash(n);
        while(front<rear){
            Node current=queue[front++];
            if(current.steps>=k){
                continue;
            }
            int m=get_digits(current.num);
            for(int i=0;i<m-1;i++){
                long long new_num=swap_digits(current.num,i,m);
                if(new_num!=-1){
                    if(!in_hash(new_num)){
                        add_hash(new_num);
                        queue[rear].num=new_num;
                        queue[rear].steps=current.steps+1;
                        rear++;
                    }
                }
            }
        }
        printf("%d\n",hash_size);
    }
    return 0;
}

时间超限,正在改进,可以催催,万一我忘记了嘞嘻嘻

相关推荐
瑶池酒剑仙1 天前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
三品吉他手会点灯1 天前
C语言学习笔记 - 27.C编程预备计算机专业知识 - 什么是字节
c语言·开发语言·笔记·学习
邪修king1 天前
C++ 继承超全详解:核心语法、作用域、默认函数、菱形继承与避坑指南
c语言·c++
djarmy1 天前
C 标准库 `<stdio.h>` 完整函数清单(官方标准 + 常用全部函数)
c语言·c++·算法
handler011 天前
速通蓝桥杯省一: 前缀和&差分(附经典例题)
c语言·c++·笔记·职场和发展·蓝桥杯
谙弆悕博士1 天前
快速学C语言——第 11 章:指针与数组
服务器·c语言·开发语言·学习方法·业界资讯·指针·数组
薇茗1 天前
【初阶数据结构】 左右逢源的分支诗律 二叉树3
c语言·数据结构·二叉树·经典oj面试题
袁雅倩19972 天前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
CHANG_THE_WORLD2 天前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
消失的旧时光-19432 天前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法