Skip to content

Latest commit

 

History

History
166 lines (133 loc) · 7.73 KB

File metadata and controls

166 lines (133 loc) · 7.73 KB

Problem #11: Largest product in a grid

ProjectEuler link Hackerrank link

The Problem (Hackerrank version)

In the 20x20 grid below, four numbers along a diagonal line have been marked in bold.

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

The product of these numbers is 26x63x78x14=1788696.

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

Input Format

Input consists of 20 lines each containing 20 integers.

Constraints

$$0 \le Each integer in the grid \le 100 <br />$$

Output Format

Print the required answer.

Sample Input 0

89 90 95 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  

Sample Output 0

73812150

Explanation 0

Try all possible ways and check the result.

Solution (Original problem)

Code (C#)

List<int> Grid = new List<int>() { 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 };

List<int> list = new List<int>();   

for (int i = 0; i < Grid.Count; i++)
{
    if (i % 20 < 17) //RIGHT 
        list.Add(Grid[i] * Grid[i + 1] * Grid[i + 2] * Grid[i + 3]);
    if (399/*399 = Grid.Count*/ - i >= 60) // Left
        list.Add(Grid[i] * Grid[i + 20] * Grid[i + 40] * Grid[i + 60]);
    if (399 - i >= 60 && i % 20 < 17) //Left-Down
        list.Add(Grid[i] * Grid[i + 21] * Grid[i + 42] * Grid[i + 63]);
    if (i % 20 >= 3 && 399 - i >= 60) //Right-Down
        list.Add(Grid[i] * Grid[i + 19] * Grid[i + 38] * Grid[i + 57]);
}

Console.WriteLine(list.Max());

Explanation

Another simple problem, we brute force it. We save every possible product to the List called list and then we print out the maximum value of list.

Solution (Hackerrank)

Code (C#)

int[][] grid = new int[20][];
for(int grid_i = 0; grid_i < 20; grid_i++){
    string[] grid_temp = Console.ReadLine().Split(' ');
    grid[grid_i] = Array.ConvertAll(grid_temp,Int32.Parse);
}

List<int> newGrid = new List<int>();

for (int i = 0; i < 20; ++i) {
    for (int j = 0; j < 20; ++j)
        newGrid.Add(grid[i][j]);
}

List<int> list = new List<int>();   

for (int i = 0; i < newGrid.Count; i++)
{
    if (i % 20 < 17) //RIGHT 
        list.Add(newGrid[i] * newGrid[i + 1] * newGrid[i + 2] * newGrid[i + 3]);
    if (399/*399 = Grid.Count*/ - i >= 60) // Left
        list.Add(newGrid[i] * newGrid[i + 20] * newGrid[i + 40] * newGrid[i + 60]);
    if (399 - i >= 60 && i % 20 < 17) //Left-Down
        list.Add(newGrid[i] * newGrid[i + 21] * newGrid[i + 42] * newGrid[i + 63]);
    if (i % 20 >= 3 && 399 - i >= 60) //Right-Down
        list.Add(newGrid[i] * newGrid[i + 19] * newGrid[i + 38] * newGrid[i + 57]);
}

Console.WriteLine(list.Max());

Explanation

Another simple problem, we brute force it. We save every possible product to the List called list and then we print out the maximum value of list. This couldve been much simpler, however I am still converting my already done algorithms to ones that hackerrank accepts. The newGrid list is completely unnecesarry, however I believe that if it ain't broke, don't fix it.