趣味编程题“马的智障”

http://img.ask.csdn.net/upload/201608/30/1472570844_203792.png

思路分析:第一种实现——直接计算不同前进策略的结果,输出最优解。

                    第二种实现——判断最后一步是跳过终点再选择往回走还是在终点前停止跳跃,改为走向终点的判断依据为:取余判断余数与N的一半之间的大小,小即为最优解。


注:题目中题意对“跳”概念的准确理解是解题关键;“在单位时间内从任意一点 x 跳到 2*x”这句话怎么理解呢?跳的步幅是动态变化的还是静态的,主要还需从题目用例中辨别。经分析题目用例,此处跳的步幅应该是静态的。这也是这道题的失败之处,题目存在歧义容易。也许是出题者故意而为之吧。


代码实现:

import java.util.Scanner;
public class StupidHorse {
    public static void main(String[] args) {
        //测试
         Scanner x=new Scanner(System.in);
         System.out.println("请输入一个小花的起始位置n以及萝卜位置k;(0=<n<=100000;0=<k<=100000):");
         int n=x.nextInt();
         int k=x.nextInt();
         System.out.println("起始位置为"+n);
         System.out.println("萝卜位置为"+k);
        minTime(n,k);
        minTime2(n, k);
    }
    //策略一:
    public static void minTime(int n,int k){
        if(n==0||n==1){
            //起点为0或1,一直走到黑
            System.out.println(k-n);
        }else{
            //定义s路程。最短时间必然是“先跳后走”。
            int s = Math.abs(k-n);
            
            //两种case:跳过终点,再往回走到终点;跳至终点前,然后走向终点。
            int x = s/n + s%n;
            int y = s/n+1 + (s/n+1)*n-s;
            
            //判断两种场景的最优解,输出。
            if(x>=y){
                System.out.println(y);
            }else{
                System.out.println(x);
            }
        }
    }
    //策略二:
    public static void minTime2(int n,int k){
        if(n==0||n==1){
            //起点为0或1,一直走到黑
            System.out.println(k-n);
        }else{
            //定义s路程。最短时间必然是“先跳后走”。
            int s = Math.abs(k-n);
            
            //两种case:跳过终点,再往回走到终点;跳至终点前,然后走向终点。最优解判断依据取余和n的一半做比较。
            int x=0;
            if(s%n<=n/2){
                x = s/n + s%n;
            }else{
                x = s/n+1 + (s/n+1)*n-s;
            }
            
            //判断两种场景的最优解,输出。
            System.out.println(x);
        }
    }
}





猜你喜欢

转载自blog.csdn.net/stefan_xiepj/article/details/52549441
今日推荐