图案
你只得到一个正方形的边长:
- 边长ALWAYS=ODD
- 平方的中间值始终=0
- 每隔一个值=距离正方形中心的距离
编写一个程序来推广该算法,并通过输出列表来创建输入正方形的列表表示
输出示例
"""
if input = 1
Matching square: 0 => List Equivalent = [[0]]
if input = 3
Matching square: 1 1 1 => List Equivalent = [[1, 1, 1],
1 0 1 [1, 0, 1],
1 1 1 [1, 1, 1]]
if input = 5
Matching square: 2 2 2 2 2 => List Equivalent = [[2, 2, 2, 2, 2],
2 1 1 1 2 [2, 1, 1, 1, 2],
2 1 0 1 2 [2, 1, 0, 1, 2],
2 1 1 1 2 [2, 1, 1, 1, 2],
2 2 2 2 2 [2, 2, 2, 2, 2]]
if input = 7
Matching square: 3 3 3 3 3 3 3 => List Equivalent = [[3, 3, 3, 3, 3, 3, 3],
3 2 2 2 2 2 3 [3, 2, 2, 2, 2, 2, 3],
3 2 1 1 1 2 3 [3, 2, 1, 1, 1, 2, 3],
3 2 1 0 1 2 3 [3, 2, 1, 0, 1, 2, 3],
3 2 1 1 1 2 3 [3, 2, 1, 1, 1, 2, 3],
3 2 2 2 2 2 3 [3, 2, 2, 2, 2, 2, 3],
3 3 3 3 3 3 3 [3, 3, 3, 3, 3, 3, 3]]
"""
我正在尝试一个我将发布的解决方案,该解决方案将正方形不均匀地拆分为0,如下所示:
side = 5 _ _ _ _ _ _
Matching square: 2 2 2 2 2 Split square: 2 1 0 1 2
2 1 1 1 2 2 1 1 1 2
2 1 0 1 2 2 2 2 2 2
2 1 1 1 2
2 2 2 2 2
并根据每一行与顶行的距离等计算出如何生成每一行
问题
对于我试图解决的这种模式/问题,有什么现有的解决方案吗?我不知道该搜索什么
一种相对简单但不优雅的方法是将矩阵从外部螺旋形向内,并为每个新周期递减值。如下:
def create_matrix(n):
curr = n // 2
matrix = [[0]*n for _ in range(n)]
counter = 0
N = n*n
left, right, top, bottom = 0, n-1, 0, n-1
while True:
# top
for i in range(left, right+1):
matrix[top][i] = curr
counter += 1
top += 1
if counter >= N:
break
# right
for i in range(top, bottom+1):
matrix[i][right] = curr
counter += 1
right -= 1
if counter >= N:
break
# bottom
for i in range(left, right+1):
matrix[bottom][i] = curr
counter += 1
bottom -= 1
if counter >= N:
break
# left
for i in range(top, bottom+1):
matrix[i][left] = curr
counter += 1
left += 1
if counter >= N:
break
curr -= 1
return matrix
快速测试:
In [2]: create_matrix(11)
Out[2]:
[[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
[5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5],
[5, 4, 3, 3, 3, 3, 3, 3, 3, 4, 5],
[5, 4, 3, 2, 2, 2, 2, 2, 3, 4, 5],
[5, 4, 3, 2, 1, 1, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 1, 1, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 2, 2, 2, 2, 3, 4, 5],
[5, 4, 3, 3, 3, 3, 3, 3, 3, 4, 5],
[5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5],
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]]
In [3]: create_matrix(5)
Out[3]:
[[2, 2, 2, 2, 2],
[2, 1, 1, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 1, 1, 2],
[2, 2, 2, 2, 2]]
以更简单的方式解决
square_size = 11
centre_x = (square_size - 1) // 2
centre_y = (square_size - 1) // 2
matrix = []
for x in range(square_size):
row = []
for y in range(square_size):
x_dif = abs(x - centre_x)
y_dif = abs(y - centre_y)
value = max(x_dif, y_dif)
row.append(value)
matrix.append(row)