Java教程

计蒜客:一维坐标的移动(java)

本文主要是介绍计蒜客:一维坐标的移动(java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

运用bfs算法

  1. 在一个长度为n的坐标轴上,蒜头君想从A点 移动到B点。他的移动规则如下:
  2. 向前一步,坐标增加1。
  3. 向后一步,坐标减少1。
  4. 跳跃一步,使得坐标乘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)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!