欧拉计划十一题:在20×20的网格中同一直线上四个数的最大乘积是多少?(perl二维数组的应用)

101 篇文章 7 订阅
52 篇文章 0 订阅

这是一个稍微有难度的题目,容易让人漏掉某种情况,我们先来看一下题目:

在以下这个20×20的网格中,四个处于同一对角线上的相邻数字用红色标了出来:

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.

在这个20×20网格中,处于任何方向上(上,下,左,右或者对角线)的四个相邻数字的乘积的最大值是多少?

这里最后一行的(上,下,左,右或者对角线)给你提供了思路,上下是一样的,左右也是一样的,但是对角线却又两条"左上--->右下“,”右上--->左下“。这两种情况是不一样的。我们通常都忘记了最后一种情况,导致最后做错,反正我刚开始就是这么做错的。

好,我们来看一下程序:

思路很简单,就是把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...


















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值