D - 量子能力猫
题目描述
猫从薛定谔的箱子里成功存活并逃脱出来,这时它发现它已经掌握了量子力学的原理并拥有运用量子的能力。即便这样它还是克服不了它喜欢钻入纸箱的天性。
假设现在有一排纸箱的一端从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));
}
}
}
}