首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能帮我理解这段代码吗?

问有人能帮我理解这段代码吗?
EN

Stack Overflow用户
提问于 2015-11-01 07:58:36
回答 2查看 901关注 0票数 1

有人能帮我理解这段代码吗?此代码用于解决此问题。你在用手机玩游戏。给您一个长度为n的数组,索引从0到n−1。数组的每个元素都是0或1。您只能移动到包含0的索引。一开始你排在第0位。在每一步中,您都可以执行以下操作之一:

向前或向后走一步。向前跳一跳,长度正好是m。这意味着您可以从位置x移动到x+1、x−1或x+m。新职位必须包含0。你也可以移动到任何大于n-1的位置。

你不能从0位置向后移动。如果你移动到大于n−1的任何位置,你就会赢得比赛。

给定数组和跳转的长度,您需要确定是否有可能赢得比赛。

代码语言:javascript
复制
        n = sc.nextInt();
        m = sc.nextInt();
        field = new int[n];
        for (int i = 0; i < n; i++) {
            field[i] = sc.nextInt();
        }

        if (makeMove(0, new LinkedList<Integer>()))
            System.out.println("YES");
        else
            System.out.println("NO");

。。。

代码语言:javascript
复制
private boolean makeMove(int position, List<Integer> prevPositions) 
  {
  if (prevPositions.contains(position)) 
    return false;
    prevPositions.add(position);

    if (position < 0) return false;
    else if (position >= n) return true;
    else if (field[position] == 1) return false;
    else {
        return makeMove(position + m, prevPositions) ||
                makeMove(position + 1, prevPositions) ||
                makeMove(position - 1, prevPositions);
    }
}

投入:6 2

代码语言:javascript
复制
   0 0 0 1 0 0

产出:是

投入:6 2

代码语言:javascript
复制
   0 0 1 1 0 0

产出:否

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-01 08:22:35

因此,我假设您理解递归的概念,它在其内部调用一个方法,如果不是,您可能想要查找它。

代码的第一部分非常简单。它初始化移动长度m和长度n数组,并使用随机二进制数字填充。

makeMove方法将遍历几个基本案例,以查看递归分支是否失败或成功。

(1) if (prevPositions.contains(position)) return false; prevPositions.add(position);

在移动之后,这段代码将检查您是否已经达到了这个位置。如果有,它返回false,因为这个例子已经知道为false,否则该方法就已经返回了true。

2.) if (position < 0) return false; else if (position >= n) return true; else if (field[position] == 1) return false;

-You不能有负位置,所以返回false。-If您的位置大于n,那么您就赢了,所以返回true -You不能移动到包含非零数字的位置,所以返回false。

3.) return makeMove(position + m, prevPositions) || makeMove(position + 1, prevPositions) || makeMove(position - 1, prevPositions);

此代码从可能的位置对其他移动进行递归调用,如果其中任何调用为真,则返回true。既然您可以跳转到position+m,那么如果makeMove(position+m, prevPositions)是真,那么makeMove(position, prevPositions)也是真。类似地,您可以移动到position+1和position-1,因此对这些位置的makeMove调用应该返回与原始位置的makeMove相同的值。希望这是有意义的!

票数 4
EN

Stack Overflow用户

发布于 2017-03-22 23:58:48

这个解决方案很好。请尝尝这个。您需要传递元素数组长度和跳转值。

代码语言:javascript
复制
public static boolean decideMove(int[] elements, int length, int jump){
    boolean result = false;
    boolean makeMove = true;
    int currentPosition = 0;
        while(makeMove){
            if (currentPosition + jump > length-1){
                return true;
            } 

            if(elements [currentPosition + jump] == 0){
                currentPosition = currentPosition + jump;
                if (currentPosition + jump > length-1){
                    return true;
                } 
            }
            if (elements[currentPosition + 1] == 0){
                currentPosition = currentPosition + 1;
                if (currentPosition + jump > length-1){
                    return true;
                } 
            }

            if(elements[currentPosition +1] ==1 && elements[currentPosition + jump]==1){
                if(elements[currentPosition - 1]==0){
                    currentPosition = currentPosition - 1;
                } else{
                    return false;
                }

            }
        }

    return result;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33460278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档