欧拉计划之题目11:在20×20的网格中同一直线上四个数的最大乘积是多少?

本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/12-1120t20

我的分析:

列,行的比较不用说了,关键是左上,右下的2条对角。

在网上搜索的代码,要么是perl语言的,要么是C语言错误的(反正我看不懂)。

我的左上:在5 x 5方格中,选取其中右斜着的3个数,那它的第一个数,肯定在左上的3*3中,后2个数,是前一个数加1.

我的右下:同上,在5 x 5方格中,选取其中左斜的3个数,那它的第一个数,肯定在右上3*3中,后2个数,对应坐标相加减.

  1 # include <stdio.h>
  2 
  3 int max;
  4 int r1,c1,r2,c2,r3,c3,r4,c4;    // 4个数的位置 
  5 int a[21][21]={
  6     {8,2,22,97,38,15,0,40,0,75,04,05,7,78,52,12,50,77,91,8},
  7     {49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,04,56,62,0},
  8     {81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,03,49,13,36,65},
  9     {52,70,95,23,04,60,11,42,69,24,68,56,01,32,56,71,37,02,36,91},
 10     {22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80},
 11     {24,47,32,60,99,03,45,02,44,75,33,53,78,36,84,20,35,17,12,50},
 12     {32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70},
 13     {67,26,20,68,02,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21},
 14     {24,55,58,05,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72},
 15     {21,36,23,9,75,00,76,44,20,45,35,14,0,61,33,97,34,31,33,95},
 16     {78,17,53,28,22,75,31,67,15,94,03,80,04,62,16,14,9,53,56,92},
 17     {16,39,05,42,96,35,31,47,55,58,88,24,00,17,54,24,36,29,85,57},
 18     {86,56,00,48,35,71,89,07,05,44,44,37,44,60,21,58,51,54,17,58},
 19     {19,80,81,68,05,94,47,69,28,73,92,13,86,52,17,77,04,89,55,40},
 20     {04,52,8,83,97,35,99,16,07,97,57,32,16,26,26,79,33,27,98,66},
 21     {88,36,68,87,57,62,20,72,03,46,33,67,46,55,12,32,63,93,53,69},
 22     {04,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36},
 23     {20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,04,36,16},
 24     {20,73,35,29,78,31,90,01,74,31,49,71,48,86,81,16,23,57,05,54},
 25     {01,70,54,71,83,51,54,69,16,92,33,48,61,43,52,01,89,19,67,48}
 26     };
 27     
 28 void Rows()
 29 {
 30     int temp=1;
 31     int i,j;
 32     for(i=0;i<20;i++)
 33     {
 34         for(j=0;j<17;j++)
 35         {
 36             if(a[i][j]&&a[i][j+1]&&a[i][j+2]&&a[i][j+3])
 37             {
 38                 temp=a[i][j]*a[i][j+1]*a[i][j+2]*a[i][j+3];
 39                 if(max<temp)
 40                 {
 41                     max = temp;
 42                     r1=i,c1=j;
 43                     r2=i,c2=j+1;
 44                     r3=i,c3=j+2;
 45                     r4=i,c4=j+3;
 46                 }
 47             }
 48         }
 49     }
 50 }
 51 
 52 void Columns()
 53 {
 54     int temp=0;
 55     int i,j;
 56     for(j=0;j<20;j++)
 57     {
 58         for(i=0;i<17;i++)
 59         {
 60             if(a[i][j]&&a[i+1][j]&&a[i+2][j]&&a[i+3][j])
 61             {
 62                 temp=a[i][j]*a[i+1][j]*a[i+2][j]*a[i+3][j];
 63                 if(max<temp)
 64                 {
 65                     max = temp;
 66                     r1=i,c1=j;
 67                     r2=i+1,c2=j;
 68                     r3=i+2,c3=j;
 69                     r4=i+3,c4=j;
 70                 }
 71             }
 72         }
 73     }
 74 }
 75 
 76 void Lefts()
 77 {
 78     int temp=0;
 79     int i,j;
 80     for(i=0;i<=16;i++)
 81     {
 82         for(j=0;j<=16;j++)
 83         {
 84             if(a[i][j]&&a[i+1][j+1]&&a[i+2][j+2]&&a[i+3][j+3])
 85             {
 86                 temp=a[i][j]*a[i+1][j+1]*a[i+2][j+2]*a[i+3][j+3];
 87                 if(max<temp)
 88                 {
 89                     max = temp;
 90                     r1=i,c1=j;
 91                     r2=i+1,c2=j+1;
 92                     r3=i+2,c3=j+2;
 93                     r4=i+3,c4=j+3;
 94                 }
 95             }
 96         }
 97     }
 98 }
 99 
100 void Rights()
101 {
102     int temp=0;
103     int i,j;
104     for(i=0;i<17;i++)
105     {
106         for(j=19;j>2;j--)
107         {
108             if(a[i][j]&&a[i+1][j-1]&&a[i+2][j-2]&&a[i+3][j-3])
109             {
110                 temp=a[i][j]*a[i+1][j-1]*a[i+2][j-2]*a[i+3][j-3];
111                 if(max<temp)
112                 {
113                     max = temp;
114                     r1=i,c1=j;
115                     r2=i+1,c2=j-1;
116                     r3=i+2,c3=j-2;
117                     r4=i+3,c4=j-3;
118                 }
119             }
120         }
121     }
122 }
123 
124 int main ()
125 {
126     max = 0;
127 
128     Rows();
129     Columns();
130     Lefts();
131     Rights();
132     
133     printf("位置是: a[%d][%d], a[%d][%d], a[%d][%d], a[%d][%d]
",r1,c1,r2,c2,r3,c3,r4,c4);
134     printf("%d * %d * %d * %d == %d
",a[r1][c1],a[r2][c2],a[r3][c3],a[r4][c4],max);
135     return 0;
136 }
View Code

如果有错误,希望能指证!!!

原文地址:https://www.cnblogs.com/orange1438/p/3501149.html