Question 46-Shortest Steps to Destination (BFS)

Original title link

Title description

考虑你从家出发步行去往一处目的地,该目的地恰好离你整数单位步长(大于等于1)。
你只能朝向该目的地或者背向该目的地行走,而你行走的必须为单位步长的整数倍,且要求你第N次行走必须走N步。
请就给出目的地离你距离,判断你是否可以在有限步内到达该目的地。
如果可以到达的话,请计算到达目的地的最短总步数(不能到达则输出-1)。

Example

输入:
2
输出:
3
说明:
距离目的地2, 需要3步:朝向走1,背向走2,朝向走3

Reference Code

import java.util.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int step = reachNumber(n);
        System.out.println(step);
    }
    
    public static int reachNumber(int target) {
    
      
        int step = 0;
        int sum = 0;
        //先一直向前走,使得sum>=target,如果步数小于这个数是不可能到达的
		//当sum>target后,再考虑能否将之前的步伐反向来恰好到达目的地
        while(sum<target){
    
    
            step++;
            sum += step;
        }
        //sum>target的话,就要考虑,能不能之前走过的某一步改为向后倒退
        //如果(sum-target)%2==0,就说明sum多出来的长度,可以通过将之前的向前的步伐 改为 向后的步伐 来使得sum==target
        // 如果(sum-target)%2!=0,此时不能通过改变步伐方向来完成。意味着我们需要再往前走(最多再走两次)
        while( (sum-target)%2!=0 ){
    
    
            step++;
            sum += step;
        }
        return step;
    }
}

BFS standard solution

public static int reachNumber(int target) {
    
    
    Queue<Integer> q = new LinkedList<>();
    int step = 0;
    q.offer(0);

    while (!q.isEmpty()) {
    
    
        int size = q.size();
        for (int i = 0; i < size; i++) {
    
    
            int cur = q.poll();
            if (cur == target)
                return step-1;
            q.offer(cur + step);
            q.offer(cur - step);
        }
        step++;
    }
    return -1;
}

Guess you like

Origin blog.csdn.net/Awt_FuDongLai/article/details/111406939