Tuesday, January 8, 2013

Problem 11: Largest product in a grid


Q)In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
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 26 × 63 × 78 × 14 = 1788696.
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

Solution: Use files for reading the Grid to generalize the problem, here's the java code:

public class Prob11 {

 
 public static void main(String[] args) {

  int max =1;
  
  int a[][]={{8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8},
      {49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,04,56,62,0},
      {81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,03,49,13,36,65},
      {52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,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,3,45,2,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,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21},
      {24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72},
      {21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95},
      {78,17,53,28,22,75,31,67,15,94,3,80,04,62,16,14,9,53,56,92},
      {16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57},
      {86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58},
      {19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40},
      {4,52,8,83,97,35,99,16,7,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},
      {4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36},
      {20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16},
      {20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54},
      {1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48},
      };
  

  //max value from left to right 
  
  for(int k =0;k < 20;k++)
  {
   int i = 0 , j = 4;
   while(j < 20)
   {
   int prod = 1;
   for(int l = i; l < j;l++)
   { 
    prod = prod * a[k][l];
   }
   if(prod > max)
    max=prod;
   
  
   i++;
   j++;
   }
    
  }
//UPDown
  for(int k =0;k< 20;k++)
  {
   int i = 0 , j = 4;
   while(j < 20)
   {
   int prod = 1;
   for(int l = i; l < j;l++)
   { 
    prod = prod * a[l][k];
   }
   if(prod > max)
    max=prod;
  
   i++;
   j++;
   }
    
  }
  
//diagonal1
  for(int i =0;i < 20; i++)
  {
  for(int j =0;j < 20;j++) 
  {
   if ((i < (20 - 4)) && (j < (20 - 4)))
            {
               int prod =1;
                for (int k=0; k < 4; k++)
                {
                    prod *= a[i+k][j+k];
                }
                if (prod > max)
                {
                    max=prod;
                      
                }
                 
            }
  }
  
  }
  
 //diagonal2 
  for(int i =0;i < 20; i++)
  {
  for(int j =0;j < 20;j++) 
  {
   if (i > 4 && (j < (20 - 4)))
            {
               int prod =1;
                for (int k=0; k < 4; k++)
                {
                    prod *= a[i-k][j+k];
                }
                if (prod > max)
                {
                    max=prod;
                      
                }
                 
            }
  }
  
  }
System.out.println(max);
}

}

No comments:

Post a Comment