网易2017年秋季校招第三道题--跳石板

import java.util.Scanner;

public class Main
{
  public static void main(String[] arg)
    {
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            int n=scan.nextInt();
            int m=scan.nextInt();
            if(n==m){
                System.out.println(0);
            }else{
                System.out.println(solve(n,m));
            }
        }
        scan.close();
    }
  private static int solve(int n,int m)
    {
        int[] dp=new int[m+1];
        int[] slates=new int[m];
        int num=0;
        slates[num++]=n;
        for(int k=0;k<num;k++)
        {
            int  x=slates[k];
            for(int i=2,ns=(int)Math.sqrt(x);i<=ns;i++)
            {
                if(x%i==0)
                {
                    int y=x+i;
                    if(y<=m&&dp[y]==0)
                    {
                        dp[y]=dp[x]+1;
                        slates[num++]=y; 
                    } 
                    y=x+x/i;
                    if(y<=m&&dp[y]==0)
                    {
                         dp[y]=dp[x]+1;
                         slates[num++]=y;
                    }
                }
           }
        }
    return dp[m]==0?-1:dp[m];
   }
}



谁能理解一下那个solve函数吗?我不是很能理解他的解题思路,代码是正确的。

全部评论
它使用了bfs的做法,slates数组存的是需要跳的石板序列,比如说当前是石板4,4有一个约数2可用,那么4+2=6,即石板6放入slates数组,下次从石板6开始跳。
点赞 回复 分享
发布于 2017-03-24 17:33
http://www.developersite.org/904-182049-%E7%BD%91%E6%98%93%E6%A0%A1%E6%8B%9B%E7%AC%94%E8%AF%95%E9%A2%98 这个链接里是所有的java 版本。感觉很强大。
点赞 回复 分享
发布于 2017-03-24 15:32

相关推荐

不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务