P1132 数字生成游戏

题目描述

小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则:

  1. 将s的任意两位对换生成新的数字,例如143可以生成314,413,134;

  2. 将s的任意一位删除生成新的数字,例如143可以生成14,13,43

  3. 在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i] < x < s[i + 1]。例如143可以生成1243,1343,但是不能生成1143,1543等。

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

另外,小明给规则3又加了一个限制,即生成数的位数不能超过初始数s的位数。若s是143,那么1243与1343都是无法生成的;若s为1443,那么可以将s删除4变为143,再生成1243或1343。

输入输出格式

输入格式:

输入的第一行包含1个正整数,为初始数字s。

第2行包含一个正整数m,为询问个数。

接下来m行,每行一个整数t(t不包含0),表示询问从s开始不断生成数字到t最少要进行多少次操作。任两个询问独立,即上一个询问生成过的数到下一个询问都不存在,只剩下初始数字s。

输出格式:

输出包括m行,每行一个正整数,对每个询问输出最少操作数,如果无论。

输入输出样例

输入样例#1:

143
3
134
133
32
输出样例#1:

1
-1
4

说明

143 -> 134

133无法得到

143 -> 13 -> 123 -> 23 -> 32

对于20%的数据,s < 100;

对于40%的数据,s < 1000;

对于40%的数据,m < 10;

对于60%的数据,s < 10000;

对于100%的数据,s < 100000,m ≤ 50000。

/*
bfs,模拟三种操作
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int s[],l1,h,f[];
bool vis[];
struct node{
int x,step;
}cur,nxt;
int bfs(){
memset(vis,,sizeof(vis));
cur.x=n;cur.step=;
vis[n]=;
queue<node>q;
q.push(cur);
while(!q.empty()){
cur=q.front();q.pop();
int num=cur.x;
int ss[],l2=;
while(num){
l2=l2+;
ss[l2]=num%;
num/=;
}//把即将要转换的数变成数组
for(int i=;i<=l2;i++){
for(int j=i+;j<=l2;j++){//枚举交换的两个数
swap(ss[i],ss[j]);
int y=;//记录更改后的数字
for(int k=l2;k>=;k--)
y=y*+ss[k];
nxt.step=cur.step+;
nxt.x=y;
if(!vis[nxt.x]){
f[nxt.x]=nxt.step;
q.push(nxt);
vis[nxt.x]=;
}
swap(ss[i],ss[j]);
}
}
for(int i=;i<=l2;i++){//枚举删除某一位数字
int y=;
for(int j=l2;j>=;j--){
if(j==i)continue;
y=y*+ss[j];
}
nxt.step=cur.step+;
nxt.x=y;
if(!vis[nxt.x]){
f[nxt.x]=nxt.step;
q.push(nxt);
vis[nxt.x]=;
}
}
if(l2<l1){//可以插数字
for(int i=;i<=l2-;i++){//枚举插在谁的后面
for(int j=ss[i]-;j>ss[i+];j--){//枚举插什么数字
int y=;
/*for(int k=l2,l=1;k>=1;k--,l++){
y=y*10+ss[k];
if(l==i)
y=y*10+j;
}*/
for(int k=l2;k>i;k--)
y=y*+ss[k];
y=y*+j;
for(int k=i;k>=;k--)
y=y*+ss[k];
nxt.x=y;
nxt.step=cur.step+;
if(!vis[nxt.x]){
f[nxt.x]=nxt.step;
q.push(nxt);
vis[nxt.x]=;
}
}
}
}
}
return -;
}
int main(){
memset(f,-,sizeof(f));
scanf("%d%d",&n,&m);
int v=n;f[n]=;
while(v){s[++l1]=v%;v/=;}
int h;bfs();
for(int i=;i<=m;i++){
scanf("%d",&h);
printf("%d\n",f[h]);
}
return ;
}

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

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

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

  2. P1132 数字生成游戏

    题目请见:传送门 以下为题解,直接从洛谷上搬过来的,还专门改了markdown,(汗) 宽搜 with 一些技巧 由于查询量很大,所以要预先处理所有答案 预处理当然是用BFS,并同时进行delete, ...

  3. 洛谷 P1118 数字三角形游戏 Label:dfs

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

  4. 洛谷P1274-魔术数字游戏

    Problem 洛谷P1274-魔术数字游戏 Accept: 118    Submit: 243Time Limit: 1000 mSec    Memory Limit : 128MB Probl ...

  5. 洛谷P1553 数字翻转(升级版)

    题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的 ...

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

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

  7. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  8. 洛谷 P5660 数字游戏 & [NOIP2019普及组]

    传送门 洛谷改域名了QAQ 解题思路 没什么好说的,一道红题,本不想发这篇博客 ,但还是尊重一下CCF吧QAQ,怎么说也是第一年CSP呢! 用getchar一个个读入.判断.累加,最后输出即可. 不过 ...

  9. 卡特兰数 洛谷P1641 [SCOI2010]生成字符串

    卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...

随机推荐

  1. Linux下监视GPU、CPU的使用情况

    1.在运行Tensorflow等程序时会使用到NVIDIA的GPU,所以在程序运行时需要监控GPU的运行情况 使用 nvidia-smi 命令 ,显示如下: nvidia-smi 显示解读: GPU: ...

  2. 剑指Offer:二叉树中和为某一值的路径【34】

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

  3. JS 中的面向对象

    创建对象的集中常见方式 1 . 使用 Object 或 对象字面量创建对象 2 . 工厂模式创建对象 3 . 构造函数模式创建对象 4 . 原型模式创建对象 1 . 使用 Object 或 对象字面量 ...

  4. react-native修改android包名

    安卓已包名作为应用的唯一id,相对iOS来说改起来就不是那么方便,但为了能正式发布自己的应用,还是得改过来. 假设包名为com.exease.etd.objective,以下地方需要修改. 首先是两个 ...

  5. react-native 支持 gif 图片

    只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...

  6. ubuntu gitlab服务器搭建

    gitlab服务器搭建 1.安装依赖包 sudo apt-get install curl openssh-server ca-certificates postfix 执行完成后,出现邮件配置,选择 ...

  7. 使用libcurl,根据url下载对应html页面

    1. [图片] Capture.JPG ​2. [代码]GetPageByURL //static member variable definestring GetPageByURL::m_curPa ...

  8. http://www.cnblogs.com/henw/archive/2012/01/06/2314870.html

    C#多线程学习 之 线程池[ThreadPool]   在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应     ...

  9. 前端多媒体(2)—— xhr异步接收处理二进制数据

    有时我们需要把远程的视频.图片数据异步下载下来,然后在js里进行特殊处理.比如把VR的图片特殊处理,把不同封装格式的视频做一次 转封装 处理等等,这类操作都要先获取二进制数据,然后特殊处理. 这个时候 ...

  10. leetcode 290 Word Pattern(map的应用)

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...