给定任何遵循此模式的奇边正方形,用算法创建其匹配列表



图案

你只得到一个正方形的边长:

  • 边长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)

最新更新