Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Largest product in a grid

I'm stuck with this problem. I do think I've got the right solution but when submitting it to the website, it does not accept it.

I tried debugging it by printing all the possible combinations and they're all done (horizontally, vertically and diagonally). The array is filled correctly also. I checked it by printing it after.

Do you know where the problem may be?

Question

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

Project Euler

Code

String product = 
          "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 "
        + "49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 "
        + "81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 "
        + "52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 "
        + "22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 "
        + "24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 "
        + "32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 "
        + "67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 "
        + "24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 "
        + "21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 "
        + "78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 "
        + "16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 "
        + "86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 "
        + "19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 "
        + "04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 "
        + "88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 "
        + "04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 "
        + "20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 "
        + "20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 "
        + "01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 ";

Scanner sc = new Scanner(product);
int[][] in = new int[20][20];
for (int i = 0 ; i < 20 ; i++){
    for (int j = 0 ; j < 20 ; j++){
        in[i][j] = sc.nextInt();
    }
}

int max = Integer.MIN_VALUE;
int tmp = 0;

for (int i = 0 ; i < 20 ; i++){
    for (int j = 0 ; j < 20 ; j++){
        if (i < 17){
            tmp = in[i][j] * in[i+1][j] * in[i+2][j] * in[i+3][j];
            if (tmp > max) max = tmp;
        }
        if (j < 17){
            tmp = in[i][j] * in[i][j+1] * in[i][j+2] * in[i][j+3];
            if (tmp > max) max = tmp;
        }
        if (j < 17 && i < 17){
            tmp = in[i][j] * in[i+1][j+1] * in[i+2][j+2] * in[i+3][j+3];
            if (tmp > max) max = tmp;
        }
    }
}

System.out.println(max);

Output

51267216
like image 214
Yassin Hajaj Avatar asked Nov 01 '15 11:11

Yassin Hajaj


2 Answers

You are only checking one diagonal, you need to check the other one as well:

if(j > 2 && i < 17) {
    tmp = in[i][j] * in[i+1][j-1] * in[i+2][j-2] * in[i+3][j-3];
    if (tmp > max) max = tmp;
}
like image 191
user2964536 Avatar answered Oct 16 '22 21:10

user2964536


You only check one diagonal, namely the one that goes in the down-right direction.

Going up-right:

if (i < 17 && j > 2){
    tmp = in[i][j] * in[i+1][j-1] * in[i+2][j-2] * in[i+3][j-3];
    if (tmp > max) max = tmp;
}
like image 42
Arc676 Avatar answered Oct 16 '22 22:10

Arc676