首页 > 其他分享 >数字生成游戏

数字生成游戏

时间:2024-01-15 10:07:11浏览次数:22  
标签:tmp 数字 int 样例 生成 lth 游戏

数字生成游戏

题目描述

小明完成了这样一个数字生成游戏,对于一个不包含 数字生成游戏_数据 的数字 数字生成游戏_#include_02 来说,有以下 数字生成游戏_对换_03 种生成新的数的规则:

  1. 数字生成游戏_#include_02 的任意两位对换生成新的数字,例如 数字生成游戏_数据_05 可以生成 数字生成游戏_对换_06
  2. 数字生成游戏_#include_02 的任意一位删除生成新的数字,例如 数字生成游戏_数据_05 可以生成 数字生成游戏_#include_09
  3. 数字生成游戏_#include_02 的相邻两位之间 数字生成游戏_数据_11 之间插入一个数字 数字生成游戏_数据_12数字生成游戏_数据_12 需要满足 数字生成游戏_#include_14。例如 数字生成游戏_数据_05 可以生成 数字生成游戏_数据_16,但是不能生成 数字生成游戏_对换_17 等。

现在小明想知道,在这个生成法则下,从 数字生成游戏_#include_02 开始,每次生成一个数,可以用然后用新生成的数生成另外一个数,不断生成直到生成 数字生成游戏_数据_19 至少需要多少次生成操作。

另外,小明给规则 数字生成游戏_对换_03 又加了一个限制,即生成数的位数不能超过初始数 数字生成游戏_#include_02 的位数。若 数字生成游戏_#include_02数字生成游戏_数据_05,那么 数字生成游戏_数据_24数字生成游戏_对换_25 都是无法生成的;若 数字生成游戏_#include_02数字生成游戏_#include_27,那么可以将 数字生成游戏_#include_02 删除变为 数字生成游戏_数据_05,再生成 数字生成游戏_数据_24数字生成游戏_对换_25

输入格式

第一行包含 数字生成游戏_#include_32 个正整数,为初始数字 数字生成游戏_#include_02

第二行包含一个正整数 数字生成游戏_数据_34,为询问个数。

接下来 数字生成游戏_数据_34 行,每行一个整数 数字生成游戏_数据_19数字生成游戏_数据_19 不包含 数字生成游戏_数据),表示询问从 数字生成游戏_#include_02 开始不断生成数字到 数字生成游戏_数据_19 最少要进行多少次操作。任两个询问独立,即上一个询问生成过的数到下一个询问都不存在,只剩下初始数字 数字生成游戏_#include_02

输出格式

数字生成游戏_数据_34 行,每行一个正整数,对每个询问输出最少操作数,如果无论如果无论也变换不成,则输出 数字生成游戏_#include_43

样例 #1

样例输入 #1

143
3
134
133
32

样例输出 #1

1
-1
4

提示

样例解释

数字生成游戏_对换_44

数字生成游戏_数据_45 无法得到

数字生成游戏_数据_46

数据范围

对于 数字生成游戏_对换_47 的数据,数字生成游戏_数据_48
对于 数字生成游戏_#include_49 的数据,数字生成游戏_#include_50
对于 数字生成游戏_#include_49 的数据,数字生成游戏_对换_52
对于 数字生成游戏_数据_53 的数据,数字生成游戏_数据_54
对于 数字生成游戏_数据_55 的数据,数字生成游戏_数据_56



#include<queue>
#include<cstdio>
#include<cstring>
main() {}
int dist[10000000];
struct in{int x,s;}u;
std::queue<in>que;
void tie(int \*a,int <h,int x) {
    lth=0;//解码 
    while(x) a[lth++]=x%10,x/=10;
}
int dis(int \*a,int lth) {
    int x=0;//还原 
    while(lth) x\*=10,x+=a[--lth];
    return x;
}
void add(int \*a,int lth,int step) {
    int tmp;//o(n)的add操作 
    a[lth]=a[lth-1];
    for(int i=lth-1;i>=1;i--) {
        for(int j=a[i+1]+1;j<a[i-1];j++) {
            a[i]=j;
            tmp=dis(a,lth+1);
            if(dist[tmp]==-1) dist[tmp]=step,que.push((in){tmp,step});
        }
        a[i]=a[i-1];
    }
}
void del(int \*a,int lth,int step) {
    int tmp,out=0;//o(n)的delete操作 
    for(int i=lth-1;i>=0;i--) {
        out^=a[i]^=out^=a[i];
        tmp=dis(a,lth-1);
        if(dist[tmp]==-1) dist[tmp]=step,que.push((in){tmp,step});
    }
}
void swa(int \*a,int lth,int step) {
    int tmp;//o(n\*(n-1)/2)的swap操作 
    for(int i=0;i<lth;i++) {
        for(int j=i+1;j<lth;j++) {
            if(a[i]==a[j]) continue;
            a[i]^=a[j]^=a[i]^=a[j];
            tmp=dis(a,lth);
            if(dist[tmp]==-1) dist[tmp]=step,que.push((in){tmp,step});
            a[i]^=a[j]^=a[i]^=a[j];
        }
    }
}
int entry() {
    memset(dist,-1,sizeof dist);
    int a[10],lth,lmt,x;
    scanf("%d",&x);
    tie(a,lmt,x),dist[x]=0;
    que.push((in){x,0});
    while(!que.empty()) {
        u=que.front();
        que.pop();
        memset(a,0,sizeof a);
        tie(a,lth,u.x);
        if(lth>1) del(a,lth,u.s+1),tie(a,lth,u.x);
        if(lth>1) swa(a,lth,u.s+1),tie(a,lth,u.x);
        if(lth<lmt) add(a,lth,u.s+1);
    }
    scanf("%d",&lmt);
    while(lmt--) {
        scanf("%d",&x);
        printf("%d\n",dist[x]);
    }
    return 0;
}
int aptal=entry();


标签:tmp,数字,int,样例,生成,lth,游戏
From: https://blog.51cto.com/u_16003019/9247603

相关文章

  • .NET Conf China 2023分享-.NET应用国际化-AIGC智能翻译+代码生成
    今年.NETConfChina2023技术大会,我给大家分享了.NET应用国际化-AIGC智能翻译+代码生成的议题,今天整理成博客,分享给所有人。随着疫情的消退,越来越多的企业开始向海外拓展,应用系统的国际化和本地化是一个巨大的技术挑战,我们今天重点探讨以下内容:.NET应用如何实现国际化?不仅仅......
  • 使用 Python 和 Pygame 制作游戏:第六章到第八章
    第六章:贪吃虫原文:inventwithpython.com/pygame/chapter6.html译者:飞龙协议:CCBY-NC-SA4.0    如何玩贪吃虫贪吃虫是Nibbles的克隆。玩家开始控制一个不断在屏幕上移动的短蠕虫。玩家无法停止或减慢蠕虫,但他们可以控制它转向的方向。红苹果随机出现在屏幕上,玩家必......
  • 使用 Python 和 Pygame 制作游戏:第九章到第十章
    第九章:推星星原文:inventwithpython.com/pygame/chapter9.html译者:飞龙协议:CCBY-NC-SA4.0         如何玩推星星推星星是Sokoban或“箱子推动者”的克隆。玩家位于一个房间,里面有几颗星星。房间中的一些瓷砖精灵上有星星标记。玩家必须想办法将星星推到有星......
  • 源生成器:根据需要自动生成机械重复代码
    title:源生成器:根据需要自动生成机械重复代码date:2022-02-02tags:-C#-.NET-Roslyn前言本文概述了利用.NETCompilerPlatform(“Roslyn”)SDK附带的源生成器(SourceGenerator)自动生成机械重复的代码。关于这部分的基础入门知识可以在MSDN[1]学到。本文默认已经有一......
  • P52 数组中出现次数超过一半的数字
    题目链接:方法一:若数组中有数字的出现次数超过数组长度的一半(绝对众数),则将该数组排序后中间位置的数一定就是该数。classSolution{public:intmoreThanHalfNum_Solution(vector<int>&nums){sort(nums.begin(),nums.end());intn=nums.size();......
  • uni-app实现生成海报
    示例图:文献参考:参考文档:https://zhuanlan.zhihu.com/p/597629702uni-app官网:uni.createSelectorQuery()|uni-app官网微信小程序官网:canvas|微信开放文档海报内容准备:1、背景图片2、二维码3、用户头像,用户名称4、简短的描述文案PS:1、若使用<canvastype="2d"id="......
  • leetcode 跳跃游戏
    classSolution{public:boolcanJump(vector<int>&nums){intn=nums.size();intcurrent_length=nums[0];if(n==1)returntrue;if(current_length==0)returnfalse;for(inti=1;i<n;i......
  • 如何把将字符串中的数字转换成数字
    主要采用的是库函数的方法,isdigit,stoi.isdigit可以判断单个字符是否是数字,stoi可以将多个字符(多位数,复数)转换成数字。判断数字可以结合isdigit给出对应的函数。点击查看代码boolisNumber(conststd::string&token){//Checkifthetokenisanumber(posit......
  • 动态链接库的生成和使用
    1、当前目录/home/xuanmiao/Demo/LSPT/Test创建文件prime.h和prime.cprime.hintisprime(longintnumber);prime.cintisprime(longintnumber){longintj;intprime=1;/*Testifthenumberisdivisible,starting*from2*/for(j=2;......
  • C#生成Excel文件
    在实际运用当中,我是将数据插入到EXCEL模板中,然后生成出带有数据的文档,并将生成的文档传入到FTP当中去的,这篇文章用来记录怎么将数据插入到EXCEL模板中。我的项目是winform程序,我将模板存放在exe程序的根目录下。在写这个方法的时候,我传入了三个参数1、数据源DataModel ;我的数据......