尤拉計劃問題十一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
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
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?
思路 :
據題意,讓我們求該矩陣從上到下,從左到右,對角線上連續四個數相乘所得的最大得數,我們把這個問題拆成四個小問題:
-
先求出矩陣每一行上連續四個數相乘所得的最大得數,然後再比較20行上每一行最大得數,比較之後得到行數方向上的最大得數。
-
接著求出矩陣每一列上連續四個數相乘所得的最大得數,然後再比較20列上每一列最大得數,比較之後得到列數方向上的最大得數。
-
然後求出從左上到右下方向對角線上連續四個數相乘所得的最大得數,然後再比較每一個對角線上連續四個數相乘所得的最大得數,其中要注意對角線矩陣的範圍。
-
同理,求出從右上到左下方向對角線上連續四個數相乘所得的最大得數,然後再比較每一個對角線上連續四個數相乘所得的最大得數,也要注意對角線矩陣的範圍。
-
示意圖:
在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
小結 :
我編的這個程式不是那麼簡潔,不足的地方請大家多指點!