zoukankan      html  css  js  c++  java
  • catch that cow

    问题描述:

    农夫想去找回他丢失的牛。设农夫当前的位置为N,牛的位置为K。农夫和牛都在数轴上。农夫有两种移动方式:

    1.从X移动到X+1或X-1,花费的时间为1 min;

    2.从X移动到X*2,花费的时间为1 min;

    假设牛不会移动,求农夫最少需要多长时间才能抓到牛。

    输入要求:

    一行,分别为N和K;

    输出要求:

    一行,为农夫抓到牛所花费的最短时间。

    Example:

    input:

    5 17

    output:

    4

    农夫想抓到牛,可以通过5->10(X*2)->9(X-1)->18(X*2)->17(X-1)的移动方式。

    思路分析:

    农夫的两种移动方式,所花费的时间都是一样的,并且我们要求最短时间,因此可以考虑用BFS的方法来实现。农夫的每一次移动,如果没有到达目的地(牛所在的位置),那么都可以将他下一步可能的移动方式X+1, X-1, X*2加入队列,并再作比较。

    import java.util.Scanner;
    
    public class Solution {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int N = in.nextInt();
            int K = in.nextInt();
            int result = bfs(N, K);
            System.out.println(result);
        }
        
        public static int bfs(int n, int k) {
            int[] steps = new int[100005];
            boolean[] visited = new boolean[100005];
            int[] queue = new int[100005];
            int head = 0;
            int tail = 0;
            steps[n] = 0;
            visited[n] = true;
            queue[tail++] = n;
            int[] dx = {1, -1};
            while(head < tail) {
                int curPoint = queue[head++];
                for(int i = 0; i < 2; i++) {
                    int x = curPoint + dx[i];
                    if(x >= 0 && x <= 100000 && !visited[x]) {
                        steps[x] = steps[curPoint] + 1;
                        visited[x] = true;
                        queue[tail++] = x;
                    }
                    if(x == k) {
                        return steps[k];
                    }
                }
                int x = curPoint * 2;
                if(x >= 0 && x <= 100000 && !visited[x]) {
                    steps[x] = steps[curPoint] + 1;
                    visited[x] = true;
                    queue[tail++] = x;
                }
                if(x == k) {
                    return steps[k];
                }
            }
            return steps[k];
        }
    
    }

    尝试用C++写了一下并比较一下性能,天,差别够大

    #include <iostream>
    #define Max 100005
    using namespace std;
    
    int steps[Max];
    int queue[Max];
    bool visited[Max];
    int N, K;
    int bfs();
    
    int main()
    {
        cin >> N >> K;
        int result = bfs();
        cout << result << endl;
        return 0;
    }
    
    int bfs(){
        steps[N] = 0;
        int head = 0;
        int tail = 0;
        queue[tail++] = N;
        visited[N] = true;
        int dx[] = {1, -1};
        while(head < tail){
            int curPoint = queue[head++];
            int x = curPoint*2;
            if(x >= 0 && x <= 100000 && !visited[x]){
                steps[x] = steps[curPoint]+1;
                queue[tail++] = x;
                visited[x] = true;
            }
            if(x == K){
                return steps[K];
            }
            for(int i = 0; i < 2; i++){
                int x_next = curPoint + dx[i];
                if(x_next >= 0 && x_next <= 100000 && !visited[x_next]){
                steps[x_next] = steps[curPoint]+1;
                queue[tail++] = x_next;
                visited[x_next] = true;
                }
                if(x == K){
                    return steps[K];
                }
            }
        }
        return steps[K];
    }
  • 相关阅读:
    教师资格证考试全部重点名词解释
    计算机软考中高级职称评定条件
    如何计算教师工龄?工龄和教龄的区别
    vue.js中 this.$nextTick()的使用
    数组的合并 总结的几种方法
    CSS3实现了左右固定中间自适应的几种方法
    文本溢出省略号
    MVC/MVP/MVVM
    vue中父组件给子组件传值的方法
    vue实例的生命周期
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12655624.html
Copyright © 2011-2022 走看看