欧拉计划之题目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]\n",r1,c1,r2,c2,r3,c3,r4,c4); 134 printf("%d * %d * %d * %d == %d\n",a[r1][c1],a[r2][c2],a[r3][c3],a[r4][c4],max); 135 return 0; 136 }
如果有错误,希望能指证!!!