题目请见:传送门
以下为题解,直接从洛谷上搬过来的,还专门改了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. linux 计划任务(crontab)

    每天写一点,总有一天我这条咸鱼能变得更咸 cron服务是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业.频率可以划分为 分钟 小时 天 月 周,格式如下: 1.crontab 服 ...

  2. C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)

    本文主要是实现操作系统级别的进程同步的代码及测试结果,代码经过测试,可直接使用,也可供参考. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题]. 随着服务进 ...

  3. UISearchBar的扩展使用

    1. 设置背景颜色 let searchBar = UISearchBar.init() searchBar.barTintColor = UIColor.white 2. 去除上下黑线 let bg ...

  4. Kotlin——最详细的数据类型介绍

    任意一种开发语言都有其数据类型,并且数据类型对于一门开发语言来说是最基本的构成,同时也是最基础的语法.当然,kotlin也不例外.kotlin的数据类型和Java是大致相同的,但是他们的写法不同,并且 ...

  5. C# To C++ Converter Cracked ( 破解版 )

    C# To C++ Converter v17.10.2 Cracked By X-Cracker 简介 C# To C++ Converter是一款将C#代码或者项目转换为C++的工具 免费版本一次 ...

  6. 【ASP.NET MVC 学习笔记】- 13 Child Action

    本文参考:http://www.cnblogs.com/willick/p/3410855.html 1.Child action 和 Patial view 类似,也是在应用程序的不同地方可以重复利 ...

  7. MongoDB备份恢复与导出导入

    说明:本文所有操作均在win7下的MongoDB3.4.4版本中进行. 一.备份与恢复 1. 备份: mongodump -h IP --port 端口 -u 用户名 -p 密码 -d数据库 -o 文 ...

  8. LeetCode 235. Lowest Common Ancestor of a Binary Search Tree (二叉搜索树最近的共同祖先)

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  9. 版本控制之二:SVN的初步使用(转)

    转自http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortoise ...

  10. 写出易于调试的SQL

    1.前言 相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦. 在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让 ...