题目请见:传送门
以下为题解,直接从洛谷上搬过来的,还专门改了markdown,(汗)

宽搜 with 一些技巧

  • 由于查询量很大,所以要预先处理所有答案
  • 预处理当然是用BFS,并同时进行delete,swap,add操作。注意,不能在x为队首元素时才更新答案,这样会使效率大打折扣(不更新的话,dist[x]任为-1,相当于少了判重)
  • 对于以上三种操作也有要求,一下进行一些优化(炒鸡模拟应该也能过,因为swap(),嗯嗯):
  • 法一:见一楼的题解,不过有局限性
  • 法二:针对add(),和delete(),可以然枚举的状态有序化以达到优化效果,适用范围更广泛;
  • 以下为我的代码,其中结构体部分可以省去,u.step可以直接用dist[x]代替。
#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 &lth,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();

P1132 数字生成游戏的更多相关文章

  1. 洛谷P1132 数字生成游戏

    P1132 数字生成游戏 题目描述 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 将s的任意两位对换生成新的数字,例如143可以生成314,413,134 ...

  2. 【u109】数字生成游戏(gen)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 1. 将s ...

  3. java猜数字小游戏

    /* * * 猜数字小游戏 * * 先由系统生成一个2-100之间的随机数字, * * 然后捕获用户从控制台中输入的数字是否与系统生成的随机数字相同, * * 如果相同则统计用户所猜的次数,并给出相应 ...

  4. 【转】Java数字抽奖游戏核心代码

    1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...

  5. [Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  6. 简单的猜数字小游戏--Python

    猜数字小游戏: #coding=utf-8 import random   answer =random.randint(1,100) #生成随机数 n=int (input("Please ...

  7. 算法:数字推盘游戏--重排九宫(8-puzzle)

    一.数字推盘游戏 数字推盘游戏(n-puzzle)是一种最早的滑块类游戏,常见的类型有十五数字推盘游戏和八数字推盘游戏等.也有以图画代替数字的推盘游戏.可能Noyes Palmer Chapman在1 ...

  8. Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例

    1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...

  9. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

随机推荐

  1. JAVA基础-反射

    一.反射的介绍 JAVA反射机制是在运行状态中,能够获取任意一个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法.这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. ...

  2. spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?

    spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的? 消息中间件在解决异步处理,模块间解耦和,和高流量场景的削峰,等情况下有着很广泛的应用 . 本文将跟大家一起 ...

  3. Maven优雅的添加第三方Jar包

    在利用Maven构建项目的时候会出现某些Jar包无法下载到本地的Repository中,鉴于这种情况比较普遍存在,特归纳以下解决问题办法:以 ojdbc14-10.2.0.4.0.jar为例[其它Ja ...

  4. Java基础-流程控制(04)

    在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说程序的流程对运行结果有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过控制语句的执行顺序来实现我 ...

  5. 【工具】Spring项目转化Spring Web项目插件

    前言 源于前一篇博文中提到,将Spring项目转化为Spring Web项目,发现添加项目文件和修改pom.xml文件等都是手动完成的,心想着开发一个Idea插件来自动化完成上面的过程,实现一键转化. ...

  6. IntentService学习

    IntentService是一个Service,主要就是Service和HandlerThread的结合 一.使用 不用多说和使用Service差不多,但是比Service多个一个方法实现: publ ...

  7. Java常用API

    常用Java API 一. java.io.BufferedReader类(用于从文件中读入一段字符:所属套件:java.io) 1. 构造函数BufferedReader(java.io.FileR ...

  8. POJ2411 Mondriaan's Dream(状态压缩)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15295   Accepted: 882 ...

  9. JS外链

    <script type=”text/javascript” src=”example.js”></script>   外链的javascript都有一个.js的后缀,但是这并 ...

  10. oracle 归档模式开启后数据库宕机解决过程

    首先按照网友说的shutdown immediately,结果hang了半个小时也么反应. 然后检查日志,全盘搜索.trc,发现 (D:\app\oracle\diag\rdbms\cms1u\cms ...