用递归方法跳跃游戏

时间:2016-03-11 13:41:38

标签: java recursion

我尝试编写代码来解决java游戏中的跳跃游戏,如果你有数组并启动索引来启动游戏跳转

起始索引他是你所站立的数字,因此你可以通过跳跃你所站号码所指示的空格数来向左或向右跳跃

目标:你想要到达该线远端(右侧)的0。您也可以保证只有一个零,这也将是最右侧。

因此,如果我达到目标并且返回False,则返回True,如果我没有,则返回True。

这是一个例子:

第一个数字是起始索引,第二个数字是数组的长度,数组是其余数字

6 8 2 3 4 6 3 5 2 0 : True

这是我的代码:

public static boolean game(int startindex,int[] array){

    int startgame=array[startindex];

    for(int p=0;p<=10;p++){

        int play=array[0+startgame];

        startgame+=play;

        if(startgame>=array.length){

            startgame-=play;
            startgame-=play;   

        }

        if(array[startgame]==0)
        return true;

    }

    return false;

} 

当我尝试这个例子时

3 8 2 3 4 6 3 5 2 0返回true

但是应该返回false,因为起始索引是3所以我从他的值= 6开始跳转左边6个空格或右边6个空格但是我无法达到0。

并尝试此时

6 8 9 9 9 9 9 9 1 0显示例外

我不知道为什么。任何人都可以帮助我

1 个答案:

答案 0 :(得分:0)

由于这显然是家庭作业(不是我第一次看到这个问题),我只会给你一些伪代码和一些如何解决这个问题的提示。

您当前的算法无法正常运行,因为您将(1)最多只执行10个步骤,(2)如果前向跳跃太远,您将只回溯。此外,你永远不会检查向后跳跃是否可以在边界之外结束。

使这个递归算法非常简单:基本上,你只有三种情况:

  • 如果当前位置超出界限,则返回false
  • 如果当前位置的值为0,则返回true
  • 否则,返回向左跳转或向右跳跃是否达到目标

另外,你可能想要记住你曾经去过的“踩踏石”,看看你是否“跳圈”。在这种情况下,也请返回false

总而言之,算法看起来像这样:

// inpt: input array, current: current position, seen: list/set of visited positions
boolean function jump(inpt, current, seen):

    if current < 0 or current >= length(inpt) then 
        return false    // jumped too far

    if inpt[current] == 0 then 
        return true     // goal found

    if current in seen then
        return false    // jumping in circles

    return (jump(inpt, current + inpt[current], seen + [current]) 
         or jump(inpt, current - inpt[current], seen + [current]))

并将其称为jump([6, 8, 2, 3, 4, 6, 3, 5, 2, 0], 0, <empty list>)