【BFS】跳石板

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…….
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class step{
    int count;
    int now;
    public step(int now,int count){
        this.now = now;
        this.count = count;
    }
}
public class Main {
    public static int Solution(int num,int aim){
        int[] vis = new int[aim+10];
        Queue<step> que = new LinkedList<step>();
        que.offer(new step(num,0));
        vis[num] = 1;
        while(!que.isEmpty()){
            step s = que.peek();
            que.poll();
            if(s.now == aim) return s.count;
            for(int i = 2;i*i <= s.now ;i++){
                if(s.now % i==0){
                    int x = s.now + i;
                    int y = s.now/i + s.now;
                    if(x <= aim && vis[x]==0){
                        que.offer(new step(x,s.count+1));
                        vis[x] = 1;
                    }
                    if(y!=x&&y<=aim&&vis[y]==0){
                        que.offer(new step(y,s.count+1));
                        vis[y] = 1;
                    }
                }
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()){
            int n = cin.nextInt();
            int aim = cin.nextInt();
            System.out.println(Solution(n,aim));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值