[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 ...
随机推荐
- 前端三大框架 Vue.js、AngularJS、React 的区别
Vue.js Vue.js 是一种构建数据驱动的Web界面的渐进式框架,Vue.js 采用自底向上增量开发的设计. Vue.js 轻量高效,数据双向绑定(响应式数据绑定), 它会自动响应数据的变化情况 ...
- 跑rbgirshick的fast-rcnn代码
需要安装Caffe.pycaffe cython.python-opencv.easydict matlab(主要用于对PASCALvoc数据集的评估) 为什么要bulid cython.caffe. ...
- 零基础快速入门SpringBoot2.0教程 (二)
一.SpringBoot2.x使用Dev-tool热部署 简介:介绍什么是热部署,使用springboot结合dev-tool工具,快速加载启动应用 官方地址:https://docs.spring. ...
- C++ 限定名称查找
限定名称查找规则实际归纳下来很简单,先对::左边的名称进行查找(遵循,限定,无限定),然后在左边查找到的(此时只查找类型名称)名字的作用域内(含内联名称空间件)查找右边出现的名字,查找到即存在(故可以 ...
- JavaScript方法中this关键字使用注意
问题来源 本文是基于廖雪峰老师JavaScript课程中的方法一节以及阮一峰老师JavaScript 的 this 原理 所记. 首先,我们了解一下JavaScript中的方法:在一个对象中绑定函数, ...
- 各种友(e)善(xin)数论总集(未完待续),从入门到绝望
目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...
- PAT Basic 1083
1083 是否存在相等的差 给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否 ...
- Spring.Net初认识——竹子整理
留个脚印,过两天总结. 看到知乎上有人对于DI|IOC 的解释,满不错,收藏下先 作者:OneNoodle链接:http://www.zhihu.com/question/23277575/answe ...
- Python linecache模块
Table of Contents 1. linecache 1.1. 其它 2. 参考资料 linecache 今天分享一个python的小模块: linecache, 可以用它方便地获取某一文件某 ...
- DiyCode开源项目 BaseActivity 分析
1.首先将这个项目的BaseActivity源码拷贝过来. /* * Copyright 2017 GcsSloop * * Licensed under the Apache License, Ve ...