[openjudge6043]哆啦A梦的时光机
[openjudge6043]哆啦A梦的时光机
试题描述
哆啦A梦有一个神奇的道具:时光机。坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来。

有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿越操作。大雄他们需要从现在出发,到达一个目标时间点进行探险,结束后再返回到现在,他们希望尽可能减少时光机的操作次数,你能帮助他们吗?
假设大雄和他的伙伴们出发的时间点(现在)为 \(S\)(\(0 < S < 1,000,000\)),希望到达的时间点(目标)为 \(T\)(\(0 < T < 1,000,000\)),已知时光机可以进行如下的时空穿越操作(\(X\) 为正整数):
可以从任意时刻 \(X\) 穿越到 \(X+1\) 或者 \(X-1\) 时刻
可以从任意时刻 \(X\) 穿越到 \(X*2\) 时刻
当 \(X\) 为偶数时,可以从 \(X\) 时刻穿越到 \(X/2\) 时刻
请问,大雄和他的伙伴们从 \(S\) 时刻出发,先到达 \(T\) 时刻,再回到 \(S\) 时刻最少需要多少次时空穿越操作?
输入
输入的第一个数是一个正整数N,表示测试数据一共有N组(0 < N < 20)。
之后有N行,每一行包含两个正整数S和T,表示出发和到达时间点。S≠T
输出
输出包括 \(N\) 行,每一行一个正整数,表示每组测试数据对应的最少时光机操作次数。
输入示例
2
5 17
4 8
输出示例
8
2
数据规模及约定
见“试题描述”和“输入”
题解
hash + 双向 BFS。
你需要相信这个题答案不会很大,搜到的状态数也存得下。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 1000010
#define HMOD 1000037
#define maxv 2147483647
#define LL long long
#define pii pair <int, int>
#define x first
#define y second
#define mp(x, y) make_pair(x, y)
struct Hash {
int ToT, head[HMOD], nxt[maxn], key[maxn];
pii val[maxn];
void init() {
ToT = 0;
memset(head, 0, sizeof(head));
return ;
}
pii Find(int x) {
int u = x % HMOD;
for(int e = head[u]; e; e = nxt[e]) if(key[e] == x) return val[e];
return mp(-233, -666);
}
bool Insert(int x, int v, int tp) {
if(Find(x).x >= 0) return 0;
int u = x % HMOD;
key[++ToT] = x; val[ToT] = mp(v, tp); nxt[ToT] = head[u]; head[u] = ToT;
return 1;
}
} h;
int Q[maxn], hd, tl;
void bfs(int s, int t) {
hd = tl = 0; Q[++tl] = s; Q[++tl] = t;
h.init();
h.Insert(s, 0, 1); h.Insert(t, 0, 2);
while(hd < tl) {
int u = Q[++hd];
pii now = h.Find(u);
if(((LL)u << 1) <= maxv) {
int v = u << 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if(!(u & 1) && u > 0) {
int v = u >> 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if((LL)u + 1 <= maxv) {
int v = u + 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if(u > 0) {
int v = u - 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
}
return ;
}
int main() {
int T = read();
while(T--) {
int a = read(), b = read();
bfs(a, b);
}
return 0;
}
[openjudge6043]哆啦A梦的时光机的更多相关文章
- [openjudge-搜索]哆啦A梦的时光机
题目描述 描述 哆啦A梦有一个神奇的道具:时光机.坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来. 有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿 ...
- [css]我要用css画幅画(七) - 哆啦A梦
接着之前的[css]我要用css画幅画(六),今天画的有所不同,画的是哆啦A梦,我们小时候对他的称呼其实是小叮当机器猫. (PS:这次我要做的事情,很多人已经做过,这并不是什么创新,我只是在学习并记录 ...
- 创建【哆啦A梦】风格字体
学习canvas,为作画.对于一个毫无逻辑思维的人简直遭罪啊~想象坐标坐标坐标啊- - 好啦言归正传,基于本月16号,在春熙路IFS展出120只哆啦a梦,以及canvas的作用,在此介绍一种PS的美化 ...
- 哆啦A梦 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 哆啦A梦连连看游戏源码完整版
这个源码是哆啦A梦连连看游戏源码完整版,也是安卓教程网android.662p.com分享过来的,哆啦A梦大家一定再熟悉不过了,这次登场的角色你能认出全部吗?赶紧把相同的小图标全部消除吧,一起体验下! ...
- 纯css画哆啦A梦
今天有点无聊,照着网上的图写了个哆啦A梦,无技术可言,纯考耐心. <!doctype html> <html lang="en"> <head> ...
- 大雄和哆啦A梦
题目:大雄和哆啦A梦题目介绍:这个图片名称有点奇怪?! 1,打开链接会看到大雄和哆啦A梦的照片,把它下载下来.就是下面这个图片. 2,用wireshark打开,会看到最后面出现 rar ,还有flag ...
- 哆啦A梦欺骗了你!浏览器CSS3测试遭质疑
首先,说明,此处只是告诫各位参与CSS3.0学习使用或者将要使用或者学习CSS3.0的朋友,不要完全信任网络资源,依靠网络资源,我们需要利用网络资源的方便和可取的部分,结合自己的理解,学好,理解好! ...
- CSS源码之纯css3制作的哆啦a梦图片
本文章向大家介绍一个纯css3制作的哆啦a梦图像,主要巧妙的使用了css3的border-radius属性,需要的朋友介意参考一下本文章的源码. 效果图: 源码 <!doctype html&g ...
随机推荐
- 3205: 数组做函数参数--数组元素求和1--C语言
3205: 数组做函数参数--数组元素求和1--C语言 时间限制: 1 Sec 内存限制: 128 MB提交: 178 解决: 139[提交][状态][讨论版][命题人:smallgyy] 题目描 ...
- clearerr, feof, ferror, fileno - 检查以及重置流状态
总览 (SYNOPSIS) #include <stdio.h> void clearerr(FILE *stream); int feof(FILE *stream); int ferr ...
- 2018.6.6 基于Oracle数据库的航天信息系统JDBC练习
综合练习 一.语言和环境 A.实现语言 Java B.环境要求 JDK 6.0及其以上版本.MyEclipse7.5及其以上版本.Oracle11g.PL/SQL Developer 二.功能要求 开 ...
- java 学习集锦
java学习系列 http://www.cnblogs.com/skywang12345/category/455711.html
- shell脚本,利用awk计算指定范围内的和。
期望得到结果如下: vivi 42800Tom 32500John 104500 解题方法如下: 1.利用数组来进行解题.
- tcl之基本语法—2
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- jvm探秘之三:GC初步
GC即垃圾收集器,虚拟机的必要组成部分. 不过这里说当然是,hotspot虚拟机(jvm的主要版本)的GC机制,前面说过了jvm的组成部分,那么想当然GC只需要负责方法区和堆就好了,虚拟机栈.本地方法 ...
- Docker背后的内核知识(一)
Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...
- Go语言之反射(二)
反射的值对象 反射不仅可以获取值的类型信息,还可以动态地获取或者设置变量的值.Go语言中使用reflect.Value获取和设置变量的值. 使用反射值对象包装任意值 Go语言中,使用reflect.V ...