1、问题描述
有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。
例如,2021 经过一次操作可以变成 2020、2022。
再如,2022 经过一次操作可以变成 2021、2023 或 1011。
请问,2021 最少经过多少次操作可以变成 1。
2、代码实现
import java.util.LinkedList;
import java.util.Queue;
public class 最少次数 {
public static void main(String[] args) {
boolean[] visit = new boolean[10000];
Queue<Integer> queue = new LinkedList<>();
queue.offer(2021);
visit[2021] = true;
int ans = 0;
while(!queue.isEmpty()) {
int size = queue.size();
while(size-->0) {
int n = queue.poll();
if(n == 1) {
System.out.println(ans);
return;
}
if(!visit[n + 1]) {
visit[n + 1] = true;
queue.offer(n + 1);
}
if(!visit[n - 1]) {
visit[n - 1] = true;
queue.offer(n - 1);
}
if(n % 2 == 0 && !visit[n / 2]) {
visit[n / 2] = true;
queue.offer(n / 2);
}
}
ans++;
}
}
}