达到结束的最小移动次数

时间:2016-03-17 00:24:03

标签: java arrays minimum

我需要计算到达数组末尾的最小跳跃次数骰子抛出数组值可能是负值/正值:

  • 积极的时候---->前进
  • 当负面------>回去

数组也可能包含R值,这意味着玩家必须再次掷骰子

起始位置在我们的数组上标记为S,结束位置为E开始位置并不总是数组的第一个元素,结束位置并不总是在结尾,它甚至可以在S

之前

示例:Array = {4,S,-2,1,R,4,3,4,3,-5,2,-4,E}

玩家从S位置开始以最快的方式到达E:

  • 掷骰子得到3并到达R案(第一步)
  • 再次投掷骰子并且有6个达到2个案例(第二个动作)
  • 跳2个案件到达E(第三步)

所以这个例子的最佳解决方案是:3次移动

2 个答案:

答案 0 :(得分:0)

让我们给你一个提示:这里要学习的关键:有时你必须转换你的输入数据,以找到解决问题的好方法。

在你的情况下;考虑将数组转换为图表:

  • 每个数组索引都是该图中的节点
  • 每个数组位置的值告诉您有关其他节点边缘的信息。例如,如果a(0)是R;然后a(0)将连接到(1),a(2).. a(6) - 因为你可以到达接下来的6个元素。

首先;我建议手动做;只需绘制图表,例如数组。

那么,解决问题的步骤是:

  1. 将数组转换为图形
  2. 在网上搜索算法以查找图表中的最小长度路径
  3. 打印出那条路;产生从S到E的最小列表
  4. 实施留给读者练习。

答案 1 :(得分:0)

我写了这个工作解决方案,我为任何感兴趣的人分享它,但是当谈到处理大数组(例如3000)时,它会抛出一个java堆空间错误,因为代码会消耗大量的内存,任何帮助或建议将不胜感激

public class Solution {
static int startPosition;


public static int compute(BufferedReader br) throws IOException {
    final int totalNodeCount = getTotalNodeNumber(br);
    final String caseArray[] = new String[totalNodeCount];
    bufferToArray(br, caseArray);
    startPosition = getStartPosition(caseArray);
    final boolean visited[] = new boolean[caseArray.length];
    int minimumNumberOfMove = 0;
    final List<Integer> reachableList = new ArrayList<Integer>();


    for (int i = 1; i <= 6; i++) 
    {
        visitedInitilise(visited);
        if (((startPosition + i) < totalNodeCount) && ((startPosition + i) > 0))
            getMinimumNumberOfMoves(caseArray, visited, startPosition + i, 0, reachableList);
    }

    // Retriving Minimum number of move from all reachble route
    if (reachableList.isEmpty())
        minimumNumberOfMove = Constants.IMPOSSIBLE;
    else

    {
        minimumNumberOfMove = reachableList.get(0);
        for (int i = 0; i < reachableList.size(); i++)
            if (reachableList.get(i) < minimumNumberOfMove)
                minimumNumberOfMove = reachableList.get(i);

    }

    return minimumNumberOfMove;

}


static int getStartPosition(String[] plateau){

    int startIndex = 0;
    for (int i = 0; i <= (plateau.length - 1); i++)
        if (plateau[i].equals("S")) 
        {
            startIndex = i;
            break;
        }

    return startIndex;
}
static void bufferToArray(BufferedReader br, String[] plateau) {
    String line;
    int i = 0;
    try 
    {
        while ((line = br.readLine()) != null)
        {
            plateau[i] = line;
            i++;
        }
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


static int getTotalNodeNumber(BufferedReader br) {
    int i = 0;
    try 
    {
        i = Integer.parseInt(br.readLine());
    } catch (NumberFormatException e) 
    {
        e.printStackTrace();
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
    return i;
}
static List<Integer> getMinimumNumberOfMoves(String[] plateau, boolean[] visited, final int currentIndex,
        int currentNumberOfMoves, List<Integer> list) {

    Boolean endIsReached = false;
    Boolean impossible = false;
    visited[startPosition] = true;
    // Checking if the current index index is negativ
    if (currentIndex < 0)
        impossible = true;

    while ((endIsReached == false) && (impossible == false) && (visited[currentIndex] == false)
            && (currentIndex < plateau.length)) 
    {
        try 
        {

            switch (plateau[currentIndex]) {
            case "E": {
                // if end is reached , pushing number of move into our list
                endIsReached = true;
                list.add(currentNumberOfMoves + 1);
                break;

            }

            case "R": {
                // Marking node as visited
                visited[currentIndex] = true;

                for (int i = 1; i <= 6; i++) 
                {
                    // Marking all case after R case as non visited
                    for (int j = currentIndex + 1; j < visited.length; j++)
                        visited[j] = false;
                    // Calculating number of move after R case
                    if (((currentIndex + i) < plateau.length) && (currentIndex > 0))
                        getMinimumNumberOfMoves(plateau, visited, currentIndex + i, currentNumberOfMoves + 1, list);
                }

                break;
            }
            default: {
                // Cheking if node was already visited
                if (visited[currentIndex] == true) 
                {
                    // Marking all node as non visited
                    visitedInitilise(visited);

                    impossible = true;
                    break;
                } 
                else 
                {
                    // when the node was not visited before , catch the jump
                    // value
                    int jumpValue = Integer.parseInt(plateau[currentIndex]);
                    // cheking that the next node is not bigger than node
                    // number and not negativ
                    if (((currentIndex + jumpValue) > plateau.length) || (currentIndex < 0)) 
                    {
                        impossible = true;
                        break;
                    } 
                    else 
                    {
                        // Marking node as visited
                        visited[currentIndex] = true;
                        // calculating minimum number of move starting from
                        // this node
                        getMinimumNumberOfMoves(plateau, visited, currentIndex + jumpValue,
                                currentNumberOfMoves + 1, list);
                        break;
                    }
                }

            }

            }

        } 
        catch (NumberFormatException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        break;
    }
    if (impossible == true)
        currentNumberOfMoves = 0;

    return list;

}

static void visitedInitilise(boolean visited[]) {

        for (int i = 0; i <= (visited.length - 1); i++)
            visited[i] = false;
    }

public static void main(String args[]){
    String testCaseID = "15"; // Write a test file number from 1 to 15, or
                                // ALL
    TestCases.test(testCaseID);
}

}