Advertisement
electricmaster

Project Euler #11

Jan 28th, 2016
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | None | 0 0
  1. /* Project Euler #11 Solution
  2.  
  3. In the 20×20 grid, four numbers along a diagonal line have been marked in red.
  4. The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
  5. What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
  6. */
  7.  
  8. #include <stdio.h>
  9.  
  10. int grid[20][20] =
  11.     {
  12.         { 8, 2, 22, 97, 38, 15,   0, 40,  0, 75,  4,  5,  7, 78, 52, 12, 50, 77, 91,  8},
  13.         {49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48,  4, 56, 62,  0},
  14.         {81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30,  3, 49, 13, 36, 65},
  15.         {52, 70, 95, 23,  4, 60, 11, 42, 69, 24, 68, 56,  1, 32, 56, 71, 37,  2, 36, 91},
  16.         {22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},
  17.         {24, 47, 32, 60, 99,  3, 45,  2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50},
  18.         {32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70},
  19.         {67, 26, 20, 68,  2, 62, 12, 20, 95, 63, 94, 39, 63,  8, 40, 91, 66, 49, 94, 21},
  20.         {24, 55, 58,  5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72},
  21.         {21, 36, 23,  9, 75,  0, 76, 44, 20, 45, 35, 14,  0, 61, 33, 97, 34, 31, 33, 95},
  22.         {78, 17, 53, 28, 22, 75, 31, 67, 15, 94,  3, 80,  4, 62, 16, 14,  9, 53, 56, 92},
  23.         {16, 39,  5, 42, 96, 35, 31, 47, 55, 58, 88, 24,  0, 17, 54, 24, 36, 29, 85, 57},
  24.         {86, 56,  0, 48, 35, 71, 89,  7,  5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58},
  25.         {19, 80, 81, 68,  5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77,  4, 89, 55, 40},
  26.         { 4, 52,  8, 83, 97, 35, 99, 16,  7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66},
  27.         {88, 36, 68, 87, 57, 62, 20, 72,  3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69},
  28.         { 4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18,  8, 46, 29, 32, 40, 62, 76, 36},
  29.         {20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74,  4, 36, 16},
  30.         {20, 73, 35, 29, 78, 31, 90,  1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57,  5, 54},
  31.         { 1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52,  1, 89, 19, 67, 48},
  32.     };
  33.  
  34. int up(int x, int y){ // check from (x, y) entry up
  35.   if(x < 4) return 0;
  36.   x = x-1; y = y-1;
  37.   int ans = 1;
  38.   int i;
  39.   for(i = x; i >= x-3; i--) ans *= grid[i][y];
  40.   return ans;
  41. }
  42.  
  43. int down(int x, int y){ // check from (x, y) entry down
  44.   if(x > 16) return 0;
  45.   x = x-1; y = y-1;
  46.   int ans = 1;
  47.   int i;
  48.   for(i = x; i <= x+3; i++) ans *= grid[i][y];
  49.   return ans;
  50. }
  51.  
  52. int left(int x, int y){ // check from (x, y) entry left
  53.   if(y < 4) return 0;
  54.   x = x-1; y = y-1;
  55.   int ans = 1;
  56.   int i;
  57.   for(i = y; i >= y-3; i--) ans *= grid[x][i];
  58.   return ans;
  59. }
  60. int right(int x, int y){ // check from (x, y) entry right
  61.   if(y > 16) return 0;
  62.   x = x-1; y = y-1;
  63.   int ans = 1;
  64.   int i;
  65.   for(i = y; i <= y+3; i++) ans *= grid[x][i];
  66.   return ans;
  67. }
  68.  
  69. int diagonalul(int x, int y){ // check from (x, y) entry diagonally to the upper left
  70.   if(x < 4) return 0;
  71.   else if(y < 4) return 0;
  72.   x = x-1; y = y-1;
  73.   int ans = 1;
  74.   int i;
  75.   for(i = 0; i <= 3; i++) ans *= grid[x-i][y-i];
  76.   return ans;
  77. }
  78.  
  79. int diagonalll(int x, int y){ // check from (x, y) entry diagonally to the lower left
  80.     if(y < 4) return 0;
  81.     else if(x > 16) return 0;
  82.     x = x-1; y = y-1;
  83.     int ans = 1;
  84.     int i;
  85.     for(i = 0; i <= 3; i++) ans *= grid[x+i][y-i];
  86.     return ans;
  87. }
  88.  
  89. int diagonalur(int x, int y){ // check from (x, y) entry diagonally to the upper right
  90.     if(x < 4) return 0;
  91.     else if(y > 16) return 0;
  92.     x = x-1; y = y-1;
  93.     int ans = 1;
  94.     int i;
  95.     for(i = 0; i <= 3; i++) ans *= grid[x-i][y+i];
  96.     return ans;
  97. }
  98.  
  99. int diagonallr(int x, int y){ // check from (x, y) entry diagonally to the lower right
  100.   if(x > 16) return 0;
  101.   else if(y > 16) return 0;
  102.   x = x-1; y = y-1;
  103.   int ans = 1;
  104.   int i = 0;
  105.   for(i = 0; i <= 3; i++) ans *= grid[x+i][y+i];
  106.   return ans;
  107. }
  108.  
  109. int solve(){ // efficiency-ho!
  110.   int greatest = 0;
  111.   int t = 0;
  112.   int i; int j;
  113.   for(i = 1; i <= 20; i++){
  114.     for(j = 1; j <= 20; j++){
  115.       t = up(i, j);
  116.       if(t > greatest) greatest = t;
  117.       t = down(i, j);
  118.       if(t > greatest) greatest = t;
  119.       t = left(i, j);
  120.       if(t > greatest) greatest = t;
  121.       t = right(i, j);
  122.       if(t > greatest) greatest = t;
  123.       t = diagonalul(i, j);
  124.       if(t > greatest) greatest = t;
  125.       t = diagonalll(i, j);
  126.       if(t > greatest) greatest = t;
  127.       t = diagonalur(i, j);
  128.       if(t > greatest) greatest = t;
  129.       t = diagonallr(i, j);
  130.       if(t > greatest) greatest = t;
  131.     } // for
  132.   }
  133.   return greatest;
  134. }
  135.  
  136. int main(){
  137.   printf("Project Euler Problem 11\n");
  138.   printf("Given a 20x20 array of numbers, find the greatest 4-number sequence that produces the biggest number when multiplied together.\n");
  139.   printf("Answer: %d", solve());
  140.   getchar();
  141.   return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement