[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 ...
随机推荐
- Nginx+proxy实现简单的负载均衡
环境说明:操作系统centos6.6 64位web操纵系统是:web1=192.168.10.10(LAMP) web2=192.168.10.11(LNMP),这里只是测试nginx实现负载均衡效果 ...
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- object-detection-crowdai数据处理
import os file=os.listdir('/home/xingyuzhou/object-detection-crowdai') file.sort(key= lambda x:int(x ...
- 多线程:InterlockedIncrement
1.InterlockedIncrement保护多线程中操作的整数. #include <stdio.h> #include <windows.h> volatile long ...
- 浏览器 DNS缓存与DNS prefetch (DNS预解析)
浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关. 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间. 浏览器在获取网站域名的实际IP地 ...
- java编程基础——从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目代码 /** * 从上往下打印出二叉树的每个节点,同层节点从左至右打印. * Created by YuKai Fan on 20 ...
- 扩展 -------jQuery
本文摘要:http://www.liaoxuefeng.com/ 编写jQuery插件 为了满足需求,我们经常会调用一些插件,js插件都是别人写的,今天就来了解了解一些方法. 给jQuery对象绑定一 ...
- 关于小程序 scroll-view中设置scroll-top无效 和小说图书阅读进度条小案例
在最近的项目有做到关于小说阅读的进度条功能,其中用到scroll-view和slider组件,发现scroll-view中的scroll-top在设置值后无效,出现这种情况大概是以下几种问题: 1.s ...
- css分层,实现遮罩底层弹出新窗口里可以操作,最下层能看到单不能操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【JAVA】cxf使用springboot与xml配置的差别所导致的问题。
使用xml时使用以下配置使报文没有加上命名空间时也能正常访问接口.bean定义的前后顺序不影响程序正常注册对象. <!-- 通过Spring创建数据绑定的类 --> <bean id ...