OpenJ_Bailian - 4001 量子能力猫 JAVA

92 篇文章 0 订阅
75 篇文章 0 订阅

D - 量子能力猫

 OpenJ_Bailian - 4001 

题目描述

猫从薛定谔的箱子里成功存活并逃脱出来,这时它发现它已经掌握了量子力学的原理并拥有运用量子的能力。即便这样它还是克服不了它喜欢钻入纸箱的天性。
假设现在有一排纸箱的一端从0开始依次编号,这只猫可以以如下的方式在箱子之间行动:

  • 走到相邻箱子:从第X号箱子走到相邻的第X+1号或X-1号箱子。
  • 量子形式转移:从第X号箱子以量子态形式转移到2X号箱子里。

不论是用走的方法还是量子转移的方法,都算作一次转移。假设现在这只猫在第X号箱子里,它希望到第Y号箱子中,请问最少需要几次转移可以达到.

 

输入数据

输入只有一行,两个整数X Y由一个空格隔开

X Y

0≤X,Y≤100000

输出数据

输出一行,一个整数,表示猫进行转移的最小次数

样例

输入

5 17

输出

4

提示

最快的方式是5-10-9-18-17,这样猫转移了4次

简单的BFS,这个题一开始我是按数学的思维去做的,但后来发现数学太麻烦。

所以认清楚什么题适合什么方法最重要,类似这样的都属于《最短》方案/路径,用BFS做是最好的。

另外别忘了X>Y的情况,这个卡了一次。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node{
	int data;
	int step;
	Node(int x, int i){
		data =x;
		step = i;
	}
}
public class Main {
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt(),y=sc.nextInt();
		if(x>=y) {
			System.out.println(x-y);
			return;
		}
		Queue<Node> q = new LinkedList<Node>();
		q.add(new Node(x,0));
		boolean vis[] = new boolean[10*y+1];
		while(!q.isEmpty()) {
			Node temp = q.poll();
			if(temp.data==y) {
				System.out.println(temp.step);
				break;
			}
			if(temp.data >= 0 && temp.data <= 10*y &&!vis[temp.data]) {
				vis[temp.data] = true;
				q.add(new Node(temp.data-1,temp.step+1));
				q.add(new Node(temp.data+1,temp.step+1));
				q.add(new Node(temp.data*2,temp.step+1));
			}
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值