-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPE011.py
More file actions
188 lines (155 loc) · 6.3 KB
/
PE011.py
File metadata and controls
188 lines (155 loc) · 6.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#!/usr/bin/env python
# -*coding:UTF-8-*-
"""
@Project hello_world
@File PE011.py
@Author Haosen Luo
@Date 2025/1/19 11:36
方阵中的最大乘积
在如下的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方阵中,四个呈一直线(竖直、水平或对角线)相邻的数的乘积最大是多少?
程序解答:70600674,矩阵副对角线 [87, 97, 94, 89]
"""
from pprint import pprint
Str = '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'
def get_matrix(string=Str, matrix_size=20):
"""
获取矩阵数据结构
:param matrix_size:
:param string:
:return:
"""
matrix = []
list_string = string.split(' ')
for i in range(matrix_size):
matrix.append([])
for j in range(matrix_size):
matrix[i].append(int(list_string[i * matrix_size + j]))
return matrix
def calculate(m=[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 66, 6, 7]]):
"""
小矩阵通用方法计算
:param m:
:return:
"""
m_1, m_2, m_3_value, m_4_value = [1, 1, 1, 1], [1, 1, 1, 1], 1, 1
m_3, m_4 = [1, 1, 1, 1], [1, 1, 1, 1]
m_size = len(m[0])
for r in range(0, m_size):
# 方法1:横向乘积
m_1[r] = eval('*'.join(map(str, m[r])))
# 方法2:纵向乘积
m_2[r] = eval('*'.join([str(m[i][r]) for i in range(m_size)]))
for c in range(0, m_size):
# 方法3:主对角线乘积
if r == c:
m_3_value *= m[r][c]
m_3[c] = m[r][c]
# 方法4:副对角线乘积
# r + c == 3
elif r + c == m_size - 1:
m_4_value *= m[r][c]
m_4[c] = m[r][c]
max_m_1 = max(m_1)
max_m_2 = max(m_2)
max_value = max(max_m_1, max_m_2, m_3_value, m_4_value)
if max_value == max_m_1:
return max_value, m_1, '横向'
elif max_value == max_m_2:
return max_value, m_2, '纵向'
elif max_value == m_3_value:
return max_value, m_3, '主对角线'
else:
return max_value, m_4, '副对角线'
def main():
"""
主程序
:return:
"""
matrix = get_matrix(Str)
# m1 = [matrix[0][0:4], matrix[1][0:4], matrix[2][0:4], matrix[3][0:4]]
# m2 = [matrix[0][1:5], matrix[1][1:5], matrix[2][1:5], matrix[3][1:5]]
# m3 = [matrix[0][2:6], matrix[1][2:6], matrix[2][2:6], matrix[3][2:6]]
#
# print(m1)
# print(m2)
# print(m3)
# ...
#
# m17 = [matrix[1][0:4], matrix[2][0:4], matrix[3][0:4], matrix[4][0:4]]
# m18 = [matrix[1][1:5], matrix[2][1:5], matrix[3][1:5], matrix[4][1:5]]
# m19 = [matrix[1][2:6], matrix[2][2:6], matrix[3][2:6], matrix[4][2:6]]
#
# print(m17)
# print(m18)
# print(m19)
#
# m240 = [matrix[16][0:4], matrix[17][0:4], matrix[18][0:4], matrix[19][0:4]]
# m241 = [matrix[16][1:5], matrix[17][1:5], matrix[18][1:5], matrix[19][1:5]]
# m242 = [matrix[16][2:6], matrix[17][2:6], matrix[18][2:6], matrix[19][2:6]]
#
# print(m240)
# print(m241)
# print(m242)
total_max_value = 1
max_matrix_combo = []
combo_way = ''
# 表示从第几行为第一行
for row_index in range(16 + 1):
for idx in range(16 + 1):
temp_matrix = [matrix[row_index + 0][idx: idx + 4],
matrix[row_index + 1][idx: idx + 4],
matrix[row_index + 2][idx: idx + 4],
matrix[row_index + 3][idx: idx + 4]
]
temp_max, temp_m, temp_combo_way = calculate(temp_matrix)
if temp_max > total_max_value:
total_max_value = temp_max
max_matrix_combo = temp_m
combo_way = temp_combo_way
print(total_max_value, max_matrix_combo, combo_way)
return total_max_value
if __name__ == '__main__':
main()
# 程序解答:
# 70600674[87, 97, 94, 89] 副对角线