P1132 数字生成游戏
题目请见:传送门
以下为题解,直接从洛谷上搬过来的,还专门改了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 <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();
P1132 数字生成游戏的更多相关文章
- 洛谷P1132 数字生成游戏
P1132 数字生成游戏 题目描述 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 将s的任意两位对换生成新的数字,例如143可以生成314,413,134 ...
- 【u109】数字生成游戏(gen)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 1. 将s ...
- java猜数字小游戏
/* * * 猜数字小游戏 * * 先由系统生成一个2-100之间的随机数字, * * 然后捕获用户从控制台中输入的数字是否与系统生成的随机数字相同, * * 如果相同则统计用户所猜的次数,并给出相应 ...
- 【转】Java数字抽奖游戏核心代码
1. [代码][Java]代码 package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...
- [Python3 练习] 007 简单的猜数字小游戏
题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...
- 简单的猜数字小游戏--Python
猜数字小游戏: #coding=utf-8 import random answer =random.randint(1,100) #生成随机数 n=int (input("Please ...
- 算法:数字推盘游戏--重排九宫(8-puzzle)
一.数字推盘游戏 数字推盘游戏(n-puzzle)是一种最早的滑块类游戏,常见的类型有十五数字推盘游戏和八数字推盘游戏等.也有以图画代替数字的推盘游戏.可能Noyes Palmer Chapman在1 ...
- Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例
1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...
- 洛谷P1118 数字三角形游戏
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...
随机推荐
- 使用getCurrentPosition方法实时获取当前Geolocation信息(赋源码文件)--html5、JavaScript
使用getCurrentPosition方法实时获取当前Geolocation信息: 1.typeof 运算符返回一个用来表示表达式的数据类型的字符串 <script> alert(typ ...
- Javascript常见浏览器兼容问题
常见浏览器原生javascript兼容性问题主要分为以下几类: 一.Dom 1.获取HTML元素,兼容所有浏览器方法:document.getElementById("id")以I ...
- mysql单独可连接,php连接mysql失败之 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
此种解决方案使用场景: 1,mysql单独可以启动而且远程工具也可以连接 2,php无法连接. 3,find / -name mysql.sock 可以找到文件路径 4,报错 Can't connec ...
- python第五课——自定义线程池
内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...
- ueditor编辑器插件 chrome中图片上传框延时问题
最近在项目中使用ueditor插件进行文字的在线编辑功能时,发现这个插件的图片上传弹框在chrome浏览器延迟非常的厉害.经过多方搜索,终于解决.现将解决方案记录如下: 1.修改/Ueditor/di ...
- IIC协议建模——读写EEPROM
案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...
- Yii2之AR类的坑与总结
本文主要记录本人从学习yii2到使用yii2开发项目过程中遇到的一些问题以及解决方法和知识点总结. 1. AR类关联哪个数据表? 默认情况下,AR类会根据类名称关联和类名相关的数据表,如:类名为Cou ...
- 在CentOS 7.3 中安装 NVIDIA GT730 显卡驱动
主机: Dell OptiPlex 390 MT (i5) 系列: 显卡: 技嘉(GIGABYTE) GV-N730D5-2GI 902MHz/5000MHz 2GB/64bit GDDR5 显卡 ( ...
- my dream
我的梦想(践踏一切可以践踏的,放弃一切必须放弃的,然后朝着自己认为的方向努力,只要自己认为对了就可以了(但是最好能考虑方面全一点,这就叫尽力了)我想要的生活怎么那么醉我想要的食物怎么那么碎我最爱的女孩 ...
- CodeForces - 294A Shaass and Oskols
//////////////////////////////////////////////////////////////////////////////////////////////////// ...