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

时间:2016-05-21 13:37:05

标签: java arrays multidimensional-array hourglass

我正在研究一个问题,我要打印数组中所有沙漏中最大的总和。您可以找到有关问题的详细信息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

截图: enter image description here

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

13 个答案:

答案 0 :(得分:19)

删除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);

答案 1 :(得分:1)

这是我的解决方案。我在计算总和的代码周围包含了一个if语句,这确保我们不会超出界限。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int arr[][] = new int[6][6];
    int max = Integer.MIN_VALUE;
    int tempMax = 0;

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

    for(int i=0; i < 6; i++){
        for(int j=0; j < 6; j++){
            if (i + 2 < 6 && j + 2 < 6) {
                tempMax += arr[i][j] + arr[i][j + 1] + arr[i][j + 2];
                tempMax += arr[i + 1][j + 1];
                tempMax += arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];

                if (max < tempMax) {
                    max = tempMax;
                } 

                tempMax = 0;
            }           
        }
    }

    System.out.println(max);
}

答案 2 :(得分:0)

这是一个简单易懂的C#等效代码,用于解决沙漏问题。

class Class1
{
    static int[][] CreateHourGlassForIndex(int p, int q, int[][] arr)
    {
        int[][] hourGlass = new int[3][];

        int x = 0, y = 0;
        for (int i = p; i <= p + 2; i++)
        {
            hourGlass[x] = new int[3];
            int[] temp = new int[3];
            int k = 0;
            for (int j = q; j <= q + 2; j++)
            {
                temp[k] = arr[i][j];
                k++;
            }
            hourGlass[x] = temp;
            x++;
        }

        return hourGlass;
    }

    static int findSumOfEachHourGlass(int[][] arr)
    {
        int sum = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            for (int j = 0; j < arr.Length; j++)
            {
                if (!((i == 1 && j == 0) || (i == 1 && j == 2)))
                    sum += arr[i][j];
            }

        }

        return sum;
    }

    static void Main(string[] args)
    {
        int[][] arr = new int[6][];
        for (int arr_i = 0; arr_i < 6; arr_i++)
        {
            string[] arr_temp = Console.ReadLine().Split(' ');
            arr[arr_i] = Array.ConvertAll(arr_temp, Int32.Parse);
        }

        int[] sum = new int[16];
        int k = 0;
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                int[][] hourGlass = CreateHourGlassForIndex(i, j, arr);
                sum[k] = findSumOfEachHourGlass(hourGlass);
                k++;
            }
        }
        //max in sum array
        Console.WriteLine(sum.Max());

    }
}

快乐编码。 谢谢, Ankit Bajpai

答案 3 :(得分:0)

您可以尝试以下代码:
我认为这对初学者来说很容易理解。

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 sum2 = 0;
        int sum3 = 0;
        int x = 0;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                for(int k = 0; k < 3; k++){
                    sum += arr[i][j+k]; //top elements of hour glass
                    sum2 += arr[i+2][j+k]; //bottom elements of hour glass
                    sum3 = arr[i+1][j+1]; //middle elements of hour glass
                    x = sum + sum2 + sum3; //add all elements of hour glass
                }
                if(max < x){
                    max  = x;
                }
                sum = 0; 
                sum2 = 0; 
                sum3 = 0;
                x = 0;
            }            
        }
        System.out.println(max);
    }
}

答案 4 :(得分:0)

这是另一个简单的选择,希望它有所帮助:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a[][] = new int[6][6];
        for(int i=0; i < 6; i++){
            for(int j=0; j < 6; j++){
                a[i][j] = in.nextInt();
            }
        }
        int hg = Integer.MIN_VALUE, sum;
        for(int i=0; i<4; i++){
            for(int j=0; j<4; j++){
               sum = 0;
               sum = sum + a[i][j] + a[i][j+1] + a[i][j+2];
               sum = sum + a[i+1][j+1];
               sum = sum + a[i+2][j] + a[i+2][j+1] + a[i+2][j+2];
               if(sum>hg)
                   hg = sum;
            }
        }
        System.out.println(hg);
        in.close();
    }
}

答案 5 :(得分:0)

在 - (减号)和零输出的情况下还有另一个操作,我们可以使用短路的ser Treeset。下面是相同的代码

public class Solution {

    public static void main(String[] args) {
        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 sum=0;int output=0;
        Set<Integer> set=new TreeSet<Integer>();

        for(int k=0;k<4;k++ )
        {
            for(int y=0;y<4;y++)
            {
                sum=arr[k][y]+arr[k][y+1]+arr[k][y+2]+arr[k+1][y+1]+arr[k+2][y]+arr[k+2][y+1]+arr[k+2][y+2];                                         set.add(sum);
            }
        }

        int p=0;

        for(int u:set)
        {
            p++;
            if(p==set.size())
            output=u;
        }

        System.out.println(output);
    }
}

答案 6 :(得分:0)

用PHP解决,可能会有帮助。

<?php

$handle = fopen ("php://stdin","r");
$input = [];

while(!feof($handle))
{
   $temp = fgets($handle);
   $input[] = explode(" ",$temp);
}

$maxSum = PHP_INT_MIN;
for($i=0; $i<4; $i++)
{
    for($j=0; $j<4; $j++)
    {
        $sum = $input[$i][$j] + $input[$i][$j + 1] + $input[$i][$j + 2] 
                                    + $input[$i + 1][$j + 1] + 
                  $input[$i + 2][$j] + $input[$i + 2][$j + 1] + $input[$i + 2][$j + 2]; 

        if($sum > $maxSum)
        {
            $maxSum = $sum;
        }
    }
}
echo $maxSum;

?>

答案 7 :(得分:0)

传递所有测试用例

import java.io.*;
import java.util.*;

public class Solution {

public static void main(String[] args) {
    Scanner read = new Scanner(System.in);
    int rowSize = 6;
    int colSize = 6;
    int[][] array = new int[rowSize][colSize];
    for(int row = 0; row < rowSize; row++) {
        for(int col = 0; col < colSize; col++) {
            array[row][col] = read.nextInt();
        }
    }
    read.close();
    int max = Integer.MIN_VALUE;
    for(int row = 0; row < 4; row++) {
        for(int col = 0; col < 4; col++) {
            int sum = calculateHourglassSum(array, row, col);
            if(sum > max) {
                max = sum;
            }
        }
    }
    System.out.println(max);
}

private static int calculateHourglassSum(int[][] array, int rowIndex, int colIndex) {
    int sum = 0;
    for(int row = rowIndex; row < rowIndex + 3; row++) {
        for(int col = colIndex; col < colIndex + 3; col++) {
            if(row == rowIndex + 1 && col != colIndex + 1) {
                continue;
            }
            sum += array[row][col];
        }
    }
    return sum;
}
}

答案 8 :(得分:0)

function galssSum(array) {
  let maxGlass = 0;
  if (array[0].length == 3) {
    maxGlass = 1;
  } else if (array[0].length > 3) {
    maxGlass = array.length - 2;
  }

  let maxValue = -100000;
  for (let i = 0; i < maxGlass; i++) {
    for (let j = 0; j < maxGlass; j++) {
      let a = array[i][j] + array[i][j + 1] + array[i][j + 2];
      let b = array[i + 1][j + 1];
      let c = array[i + 2][j] + array[i + 2][j + 1] + array[i + 2][j + 2];

      let sum = a + b + c;

      if (maxValue<sum) {
        maxValue = sum;
      }
    }
  }

  return maxValue;
}

console.log(galssSum([[1, 1, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0], [0, 0, 2, 4, 4, 0], [0, 0, 0, 2, 0, 0], [0, 0, 1, 2, 4, 0]]));

答案 9 :(得分:0)

int hourglassSum(vector<vector<int>> vec) {

    int res = 0;
    int size = ((vec[0].size())-2) * ((vec.size())-2);
    //cout<<size<<endl;
    vector<int> res_vec(size);
    int j = 0;
    int itr =0 ;
    int cnt = 0;
    int mid = 0;
    int l =0;
    while((l+2) < vec.size())
    {
while((j+2) < vec.size())
{
        for(int i =j ;i<j+3; i+=2)
        {
            //cout<<i<<" :";
            for(int k=l;k<l+3;k++)
            {
                //cout<<k<<" ";
                res_vec[itr] += vec[i][k];
            }
            //cout<<endl;
        }
        res_vec[itr] += vec[j+1][l+1];
        //cout<<endl;
itr++;
        j++;
}
l++;
j=0;
    }

    int max=res_vec[0];
for(int i =1;i<res_vec.size();i++)
{
if(max < res_vec[i])
{
    max = res_vec[i];
}
    //cout<<res_vec[i]<< " ";
}
res = max;
//cout<<endl;
    return res;
}

答案 10 :(得分:0)

// Complete the hourglassSum function below.
static int hourglassSum(int[][] arr) {
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < arr.length - 2; i++) {
        for (int j = 0; j < arr.length - 2; j++) {
            int hourGlassSum = (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]);
            max = Math.max(hourGlassSum,max);
        }

    }
    return max;
}

答案 11 :(得分:-1)

import java.io.*;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int low = -9,high = 5;
        int lh = low * high;
        int sum = 0, i, j;
        int max = 0;
        int a[][] = new int[6][6];
        for (i = 0; i < 6; i++) {
            for (j = 0; j < 6; j++) {
                a[i][j] = in.nextInt();
            }
        }

        for (i = 0; i < 4; i++) {
           for (j = 0; j < 4; j++) {
               sum = (a[i][j] + a[i][j+1] + a[i][j+2]); 
               sum = sum + a[i+1][j+1];
               sum = sum + (a[i+2][j] + a[i+2][j+1] + a[i+2][j+2]);

               if (sum > lh) lh = sum;
            }
        }
        System.out.print(lh);
    }
}

答案 12 :(得分:-1)

你去..

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a[][] = new int[6][6];
    int max = 0;
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 6; j++) {
            a[i][j] = in.nextInt();
        }
    }
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            int sum = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i + 1][j + 1]
                    + a[i + 2][j] + a[i + 2][j + 1] + a[i + 2][j + 2];
            if (sum > max || (i == 0 && j == 0)) {
                max = sum;
            }
        }
    }
    System.out.println(max);
}