我正在解决一个问题,我必须在阵列中所有沙漏中打印最大的金额。您可以找到有关问题here-的详细信息

我尝试了什么:

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

输入:
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

输出:
12

预期输出:
13

截图:
java - Java-如何解决此2D阵列沙漏?-LMLPHP

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

最佳答案

删除if (arr[arr_i][arr_j] > 0)语句。它阻止在第1行第0列中找到答案,因为该单元格为0

对您的代码进行其他改进的注释:

  • 如果最好的沙漏总和是-4怎么办?您应该将tmp_sum初始化为Integer.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);
    

    09-18 13:17