web-dev-qa-db-fra.com

Java - Comment résoudre ce sablier multidisque 2D?

Je travaille sur un problème où je dois imprimer la plus grosse somme parmi tous les sabliers du tableau. Vous pouvez trouver les détails sur le problème ici-

Ce que j'ai essayé:

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

Contribution:

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

Sortie:

12

Production attendue:

13

Capture d'écran: enter image description here

Je ne sais pas où je me trompe. Je ne comprends pas pourquoi la sortie attendue est 13. Selon la description donnée dans le problème, il devrait s'agir de 10. Est-ce une mauvaise question ou est-ce que ma compréhension est fausse?

6
RajSharma

Supprimez l'instruction if (arr[arr_i][arr_j] > 0). Cela empêche de trouver la réponse à la ligne 1, colonne 0, car cette cellule est 0.

Commentaires pour d'autres améliorations de votre code:

  • Et si la meilleure somme en sablier est -4? Vous devez initialiser tmp_sum à Integer.MIN_VALUE. Et appelez-le maxSum, pour mieux décrire son objectif.

  • Vous ne devez pas définir sum en dehors de la boucle. Déclarez-le lors de sa première affectation, vous n'avez pas besoin de le réinitialiser à 0 par la suite.

  • Vos itérateurs doivent être juste i et j. Ce sont des noms standard pour les itérateurs d’entiers, et garde le code ... plus propre.
    Si vous préférez des noms plus longs, utilisez row et col, car c'est ce qu'ils représentent.

  • Vous n'avez pas besoin de parenthèses autour des recherches sur les tableaux.

  • Par souci de clarté, j'ai formaté le code ci-dessous pour afficher la forme de sablier dans les recherches de tableau.

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

C'était ma solution. J'ai enroulé une instruction if autour du code qui calcule la somme, ce qui garantit que nous ne sortons pas du cadre.

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

Passe tous les cas de test

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
Aravinth Sundaram

Résolu en PHP, peut être utile.

<?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
Golam Mahmud Rafi

Voici une autre option facile, espérons que cela aide:

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

Voici le code équivalent simple et facile à comprendre en C # pour votre problème de sablier.

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

    }
}

Bonne codage ... Merci., Ankit Bajpai

0
ABajpai

il y a une autre option dans le cas de - (moins) et de sortie zéro, nous pouvons utiliser un Treeset ser court-circuité pour la même chose. ci-dessous est l'exemple de code 

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

Vous pouvez essayer ce code:
Je pense que cela sera facile à comprendre pour les débutants. 

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