Java-как решить этот 2D-массив песочных часов?

Я работаю над проблемой, где я должен напечатать самую большую сумму среди всех песочных часов в массиве. Вы можете найти подробную информацию о проблеме здесь

что я пробовал:

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

I не знаю, что я делаю не так. Я не могу понять, почему ожидаемый результат 13. Согласно описанию, приведенному в задаче, оно должно быть 10. Это неправильный вопрос или мое понимание этого неверно?

12 ответов


удалить if (arr[arr_i][arr_j] > 0) заявление. Это предотвращает поиск ответа в строке 1, столбце 0, потому что эта ячейка 0.

комментарии для других улучшений в коде:

  • что делать, если лучшая сумма песочных часов -4? Вы должны инициализировать tmp_sum до Integer.MIN_VALUE. И назовите его maxSum, чтобы лучше описать его цели.

  • вы не должны определить sum вне цикла. Объявите его, когда он впервые назначен, а затем вам не нужно сбрасывать его в 0 потом.

  • ваши итераторы должны быть просто i и j. Это стандартные имена для целочисленных итераторов и сохраняет код ... уборщик.
    Если вы предпочитаете более длинные имена, используйте row и col, так что то, что они представляют.

  • вам не нужны скобки вокруг поиска в массиве.

  • для ясности, я отформатировал код ниже, чтобы показать форма песочных часов в поиске массива.

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

Это было мое решение. Я обернул оператор 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);
}

вот простой и легкий для понимания 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());

    }
}

Удачи В Кодировании. Спасибо, Анкит БайПай


вы можете попробовать этот код:
Думаю, это будет легко понять новичкам.

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

вот еще один простой вариант, надеюсь, это поможет:

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

существует еще один вариант в случае- (минус) и нулевого выхода, мы можем использовать shorted Ser Treeset для того же . ниже приведен код sameple

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

решено в 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;

?>

проходит все тесты

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

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

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

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

здесь вы идете..

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