web-dev-qa-db-ja.com

Java-この2D配列の砂時計を解く方法は?

配列内のすべての砂時計の中で最大の合計を印刷しなければならない問題に取り組んでいます。問題の詳細を見つけることができます 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。これは間違った質問ですか、これに対する私の理解は間違っていますか?

6
RajSharma

if (arr[arr_i][arr_j] > 0)ステートメントを削除します。そのセルは0であるため、行1、列0で答えを見つけることができません。

コードの他の改善に関するコメント:

  • 砂時計の合計が-4の場合はどうなりますか? tmp_sumInteger.MIN_VALUEに初期化する必要があります。そして、それをmaxSumと名付け、その目的をよりよく説明します。

  • ループの外でsumを定義しないでください。最初に割り当てられたときに宣言すると、後で0にリセットする必要はありません。

  • イテレータはijだけにする必要があります。これらは整数反復子の標準的な名前であり、コードをよりクリーンに保ちます。
    より長い名前を好む場合は、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);
20
Andreas

これが私の解決策でした。合計を計算するコードを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);
}
1
sean le roy
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]]));
0
prudhvireddy

すべてのテストケースに合格

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

?>
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;
}
0
Mohamed Elkady

ここに別の簡単なオプションがあります。

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

これは、砂時計の問題に対応するシンプルで理解しやすい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

0
ABajpai

-(マイナス)で出力がゼロの場合、別のオプションがあり、同じに短絡された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);
    }
}

あなたはこのコードを試すことができます:
これは初心者には理解しやすいと思います。

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);
    }
}
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;
}
0
mudunuri ramesh