任何人都可以帮我理解这段代码吗?

时间:2015-11-01 07:58:37

标签: java arrays algorithm linked-list

任何人都可以帮我理解这段代码吗? 此代码用于解决此问题。 你在手机上玩游戏。您将获得一个长度为n的数组,索引范围为0到n-1。数组的每个元素都是0或1.您只能移动到包含0的索引。首先,您处于第0位。在每次移动中,您都可以执行以下操作之一:

向前或向后走一步。 向前跳一个正好长度的跳跃。 这意味着您可以在一次移动中从位置x移动到x + 1,x-1或x + m。新位置必须包含0.此外,您可以移动到大于n-1的任何位置。

你无法从位置0向后移动。如果你移动到任何大于n-1的位置,你就赢了比赛。

考虑到阵列和跳跃的长度,你需要确定是否有可能赢得比赛。

        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");

。 。

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

   0 0 0 1 0 0

输出:是

输入:6 2

   0 0 1 1 0 0

输出:否

2 个答案:

答案 0 :(得分:4)

所以,我假设您理解递归的概念,即在其自身内部调用方法,否则您可能需要查找它。

第一部分代码非常简单。它初始化移动长度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;

- 您不能有负面位置,因此返回false。 - 如果你的位置大于n那么你就赢了,所以回归true - 您无法移动到包含非零数字的位置,因此请返回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+1position-1,因此调用这些位置的makeMove应返回与原始位置的makeMove相同的值。希望这是有道理的!

答案 1 :(得分:0)

此解决方案正常。请试试这个。你需要传递元素数组长度和跳转值。

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;
}