这是一个稍微有难度的题目,容易让人漏掉某种情况,我们先来看一下题目:
在以下这个2020的网格中,四个处于同一对角线上的相邻数字用红色标了出来:
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
这四个数字的乘积是:26 63 78 14 = 1788696.
在这个2020网格中,处于任何方向上(上,下,左,右或者对角线)的四个相邻数字的乘积的最大值是多少?
这里最后一行的(上,下,左,右或者对角线)给你提供了思路,上下是一样的,左右也是一样的,但是对角线却又两条"左上--->右下“,”右上--->左下“。这两种情况是不一样的。我们通常都忘记了最后一种情况,导致最后做错,反正我刚开始就是这么做错的。好,我们来看一下程序:
思路很简单,就是把20X20的放在一个二维数组中,然后分为四种情况分别进行运算就好了。
use strict; use warnings; my $big=0; my $i; my $j; my $sum; my @num=( ["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"], ); #第一种情况,左---->右 for($i=0;$i<16;$i++) { for($j=0;$j<16;$j++) { $sum = $num[$i][$j]*$num[$i][$j+1]*$num[$i][$j+2]*$num[$i][$j+3]; if($sum>$big) { $big=$sum; } else { next; } } } print "$big\n"; #第二种情况,上--->下 $big=0; for($i=0;$i<16;$i++) { for($j=0;$j<16;$j++) { $sum = $num[$i][$j]*$num[$i+1][$j]*$num[$i+2][$j]*$num[$i+3][$j]; if($sum>$big) { $big=$sum; } else { next; } } } print "$big\n"; #第三种情况,左上--->右下 $big=0; for($i=0;$i<16;$i++) { for($j=0;$j<16;$j++) { $sum = $num[$i][$j]*$num[$i+1][$j+1]*$num[$i+2][$j+2]*$num[$i+3][$j+3]; if($sum>$big) { $big=$sum; } else { next; } } } print "$big\n"; #第四种情况,右上--->左下 $big=0; for($i=4;$i<20;$i++) { for($j=1;$j<16;$j++) { $sum = $num[$i][$j]*$num[$i-1][$j+1]*$num[$i-2][$j+2]*$num[$i-3][$j+3]; if($sum>$big) { $big=$sum; } else { next; } } } print "$big\n";
得到四个结果,我们看看就知道大小了
结果如下:
C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl" 48477312 51267216 32719995 70600674 Hit any key to close this window...