Java - 如何解决这个2D阵列小时玻璃?

Raj*_*rma 6 java arrays multidimensional-array hourglass

我正在研究一个问题,我要在数组中的所有沙漏中打印最大的总和.你可以在这里找到有关问题的详细信息-

我尝试了什么:

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[][] = new int[6][6];
        for (int arr_i = 0; arr_i < 6; arr_i++) {
            for (int arr_j = 0; arr_j < 6; arr_j++) {
                arr[arr_i][arr_j] = in.nextInt();
            }
        }

        int sum = 0;
        int tmp_sum = 0;
        for (int arr_i = 0; arr_i < 4; arr_i++) {
            for (int arr_j = 0; arr_j < 4; arr_j++) {
                if (arr[arr_i][arr_j] > 0) {
                    sum = sum + (arr[arr_i][arr_j]) + (arr[arr_i][arr_j + 1]) + (arr[arr_i][arr_j + 2]);
                    sum = sum + (arr[arr_i + 1][arr_j + 1]);
                    sum = sum + (arr[arr_i + 2][arr_j]) + (arr[arr_i + 2][arr_j + 1]) + (arr[arr_i + 2][arr_j + 2]);
                    if (tmp_sum < sum) {
                        tmp_sum = sum;
                    }
                    sum = 0;
                }
            }
        }
        System.out.println(tmp_sum);
    }
}
Run Code Online (Sandbox Code Playgroud)

输入:

1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 9 2 -4 -4 0
0 0 0 -2 0 0
0 0 -1 -2 -4 0
Run Code Online (Sandbox Code Playgroud)

输出:

12
Run Code Online (Sandbox Code Playgroud)

预期产出:

13
Run Code Online (Sandbox Code Playgroud)

截图: 在此输入图像描述

我不知道我在哪里做错了.我无法理解为什么预期的输出13.根据问题中给出的描述应该是10.这是一个错误的问题还是我对此的理解是错误的?

And*_*eas 20

删除if (arr[arr_i][arr_j] > 0)声明.它阻止在第1行第0列找到答案,因为该单元格是0.

对代码的其他改进的评论:

  • 如果最好的沙漏总和是-4什么?你应该初始化tmp_sumInteger.MIN_VALUE.并命名maxSum,以更好地描述它的目的.

  • 你不应该sum在循环之外定义.在第一次分配时声明它,然后您不必将其重置为0之后.

  • 你的迭代器应该只是ij.这些是整数迭代器的标准名称,并保持代码...更清晰.
    如果你喜欢更长的名字,请使用rowcol,因为这就是他们所代表的.

  • 数组查找周围不需要括号.

  • 为清楚起见,我格式化了下面的代码,以显示数组查找中的沙漏形状.

Scanner in = new Scanner(System.in);
int arr[][] = new int[6][6];
for (int i = 0; i < 6; i++){
    for (int j = 0; j < 6; j++){
        arr[i][j] = in.nextInt();
    }
}

int maxSum = Integer.MIN_VALUE;
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
        int sum = arr[i    ][j] + arr[i    ][j + 1] + arr[i    ][j + 2]
                                + arr[i + 1][j + 1]
                + arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];
        if (maxSum < sum) {
            maxSum = sum;
        }
    }
}
System.out.println(maxSum);
Run Code Online (Sandbox Code Playgroud)