计蒜客:一维坐标的移动(java)
作者:互联网
运用bfs算法
- 在一个长度为n的坐标轴上,蒜头君想从A点 移动到B点。他的移动规则如下:
- 向前一步,坐标增加1。
- 向后一步,坐标减少1。
- 跳跃一步,使得坐标乘2。
蒜头君不能移动到坐标小于0或大于n的位置。蒜头想知道从A点移动到B点的最少步数是多少,你能帮他计算出来么?
输入格式
第一行输入三个整数n,A,B,分别代表坐标轴长度,起始点坐标,终点坐标。(0≤A,B≤n≤50000)
输出格式
输出一个整数占一行,代表蒜头要走的最少步数。
样例输入
10 2 7
样例输出
3
import java.util.*;
class Yidong{
int step = 0,x=0;
public Yidong(){
}
public Yidong(int x,int step){
this.x=x;
this.step = step;
}
}
public class Main {
static int n=0,A=0,B=0,result=0;
static int[] oprate = {1,-1,2};
static int[] visit = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
A=sc.nextInt();
B=sc.nextInt();
visit = new int[n+1];
bfs(A);
System.out.print(result);
}
public static void bfs(int a){
Queue<Yidong> queue = new LinkedList<Yidong>();
visit[a] = 1;
queue.offer(new Yidong(a,0));
int flag = Math.abs(A-B);
while(!queue.isEmpty()){
Yidong temp = queue.poll();
boolean find = false;
for(int i=0;i<3;i++){
if(i==2){
if(temp.x*2<=n){
if(temp.x*2==B){
result = temp.step+1;
find = true;
break;
}
if(visit[temp.x*2]==0){
visit[temp.x*2]=1;
queue.offer(new Yidong(temp.x*2,temp.step+1));
}
}
}else{
if(temp.x+oprate[i]<=n){
if(temp.x+oprate[i] == B){
result = temp.step+1;
find = true;
break;
}
if(visit[temp.x+oprate[i]]==0){
visit[temp.x+oprate[i]]=1;
queue.offer(new Yidong(temp.x+oprate[i],temp.step+1));
}
}
}
}
if(find){
break;
}
}
}
}
标签:java,int,static,坐标,一维,new,计蒜客,public,Yidong 来源: https://blog.csdn.net/weixin_57097732/article/details/122494689