欧拉计划问题十一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

小结 :

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

猜你喜欢

转载自blog.csdn.net/qq_38910271/article/details/83033287