2-d迷宫中马里奥的最大路径总和

时间:2017-11-16 19:46:54

标签: java arrays

我遇到类似这样的问题...

马里奥陷入2d迷宫(M * N阵列)。他目前在第一排(任何一个牢房)。他只限于3种类型的动作 - 向下,向左和向右。每个细胞都有一个水果(+ ve或-ve值)。当马里奥通过细胞时,水果被消耗,因此获得的点数增加或减少,之后水果不再存在。目的是通过让他到最后一排来找到马里奥的最高分。

所以我把问题归结为以下......

可获得尺寸为M * N的二维阵列。每个单元格具有+ ve或-ve值。我们可以向下,向左或向右移动,但这样做会使当前单元格无效(使其为0)。我们必须找到从第一行到最后一行的遍历的最大总和。

我设计的方法:

int maxVal(int[][] mat)
    {
        int r = mat.length;
        int c = mat[0].length;
        int[][] maxValues = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (i == 0 && j == 0) {
                    maxValues[i][j] = mat[i][j];
                    mat[i][j] = 0;
                } else if (i == 0) {
                    maxValues[i][j] = maxValues[i][j - 1] + mat[i][j];
                    maxValues[i][j - 1] = 0;
                } else if (j == 0) {
                    maxValues[i][j] = maxValues[i - 1][j] + mat[i][j];
                    maxValues[i - 1][j] = 0;
                } else {
                    int temp = Math.max(maxValues[i][j - 1], maxValues[i - 1][j]);
                    if (j + 1 < c) {
                        temp = Math.max(temp, maxValues[i][j + 1]);
                        if (maxValues[i][j + 1] >= maxValues[i][j - 1]
                                && maxValues[i][j + 1] >= maxValues[i - 1][j]) {
                            maxValues[i][j + 1]=0;
                        }
                        else if (maxValues[i][j - 1] >= maxValues[i][j + 1]
                                && maxValues[i][j - 1] >= maxValues[i - 1][j]) {
                            maxValues[i][j - 1]=0;
                        }
                        else if (maxValues[i-1][j ] >= maxValues[i][j - 1]
                                && maxValues[i-1][j] >= maxValues[i][j+1]) {
                            maxValues[i-1][j]=0;
                        }
                    }
                    else{
                        if(maxValues[i-1][j ] >= maxValues[i][j - 1])
                            maxValues[i-1][j]=0;
                        else if(maxValues[i][j-1 ] >= maxValues[i-1][j ])
                            maxValues[i][j-1]=0;
                    }

                    temp += mat[i][j];
                    maxValues[i][j] = temp;
                }
            }
        }
        return maxValues[r - 1][c - 1];
    }

我想反馈我做错了什么,因为我显然忽视了一些事情。

1 个答案:

答案 0 :(得分:0)

你应该重新考虑你的方法。您的目标是检查所有可能的路径,然后选择具有最高值的路径。我建议使用递归方法。