欧拉计划问题十一matlab实现

Problem 11 :Largest product in a grid

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

               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

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

思路 :

据题意,让我们求该矩阵从上到下,从左到右,对角线上连续四个数相乘所得的最大得数,我们把这个问题拆成四个小问题:

  1. 先求出矩阵每一行上连续四个数相乘所得的最大得数,然后再比较20行上每一行最大得数,比较之后得到行数方向上的最大得数。

  2. 接着求出矩阵每一列上连续四个数相乘所得的最大得数,然后再比较20列上每一列最大得数,比较之后得到列数方向上的最大得数。

  3. 然后求出从左上到右下方向对角线上连续四个数相乘所得的最大得数,然后再比较每一个对角线上连续四个数相乘所得的最大得数,其中要注意对角线矩阵的范围。

  4. 同理,求出从右上到左下方向对角线上连续四个数相乘所得的最大得数,然后再比较每一个对角线上连续四个数相乘所得的最大得数,也要注意对角线矩阵的范围。

  5. 示意图:

     

在matlab中写入,A=【】;括号内写入矩阵,输入diag(A)就会的到对角线元素,即上图的对角线,diag(A,-1)就会得到橙色线左下方的第一个对角线。

综上所诉,比较以上四个情况所得的四个数,最大数即为题解。

代码 : 

clear,clc;
tic
A = [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];
LargestColumn = 0;
LargestRow = 0;
LargestDiagonally1 = 0;
LargestDiagonally2 = 0;

%%get the largest number of row ----------- up to down
for i = 1:20 %row
    max(i) = 0;
    for j = 1:17 %column
        s(i) = prod(A(i,j:j+3));
        if s(i)>max(i)            %compare the largest of row 
            max(i) = s(i);
        end
    end
    if max(i)>LargestColumn
        LargestColumn = max(i);
    end
end
disp(LargestColumn);

%%get the largest number of column
for m = 1:20 %column
    Max(m) = 0;
    for n = 1:17%row
        s(m) = prod(A(n:n+3,m));
        if s(m) > Max(m)
            Max(m) = s(m);
        end
    end
    %disp(Max(m));
    if Max(m) > LargestRow
        LargestRow = Max(m);
    end
end
disp(LargestRow);

%%get the largest number of diagonally--------northwest to southeast
for c = 1:33
    for a = -16:16
        B = diag(A,a)';
        D = length(B);
        MAX(c) = 0;
        for b = 1:D-4+1
            s(c) = prod(B(b:b+3));
            if s(c) > MAX(c)
                MAX(c) = s(c);
            end
        end
        %disp(MAX(c));
        if MAX(c) > LargestDiagonally1
            LargestDiagonally1 = MAX(c);
        end
    end
end
disp(LargestDiagonally1);

%%get the largest number of diagonally--------southeast to northwest 
for c = 1:33
    for a = -16:16
        B = diag(A(1:end,end:-1:1),a)';
        D = length(B);
        MAX(c) = 0;
        for b = 1:D-4+1
            s(c) = prod(B(b:b+3));
            if s(c) > MAX(c)
                MAX(c) = s(c);
            end
        end
        %disp(MAX(c));
        if MAX(c) > LargestDiagonally2
            LargestDiagonally2 = MAX(c);
        end
    end
end
disp(LargestDiagonally2);
toc

结果 : 70600674

小结 :

我编的这个程序不是那么简洁,不足的地方请大家多指点!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值