1、题目描述
一个大小为(2t+1)*(2t+1)的方阵,中心点的坐标为 center,依次求出每一个方阵中的坐标。如下图所示,是一个 t 等于 2 的方阵。
2、计算坐标
由题目可知,方阵一定是一个奇数乘以奇数的矩阵,中心点的坐标为 center,则每一层围绕中心的坐标可以通过计算得出,上图中我标记相同颜色的区域同一层。
每一层的元素的个数为 8t,这个结果可以通过下面的计算得出,那么我们就可以通过这个表达式来计算出每一层的坐标。
记中心点 center 为第 0 层,之后依次为第一层、第二层······。
在第一层中,第一行的元素个数为 2*1+1=3,然后第二列的元素个数为 2*1-1=1,第二行和第一列依次为 2*1+1=3 和 2*1-1=1。所以第一层共有 8 个元素,第二层共有 16 个元素,从上面的图片中也可以数出来,结果是正确的。很明显的可以算出,每一层共有 8t 个元素,这点可以通过数学归纳法得以验证。
之后开始计算每一层的坐标,我们从每一层的左上角开始计算,中心点center的坐标我们设为(m,n),第一层的左上角为 (m-1,n+1),之后每一层的第一个坐标为(m-i,n+i)(for i in [1,t])。
3、python代码表示
def get_dxy_list(center_point, t):
point_list = [(0, 0)]
for i in range(1, t + 1):
left_lower = (center_point[0] - i, center_point[1] - i)
point_list.append(left_lower)
for j in range(8 * i - 1):
# print((1 - j // 2 * i, j // 2 * i), end="\t")
# print((-(1 - (j // 6 * i)), -(j // 6 * i)))
if j < 4 * i:
point_list.append((point_list[-1][0] + 1 - j // (2 * i), point_list[-1][1] + j // (2 * i)))
else:
point_list.append((point_list[-1][0] - 1 + (j // (6 * i)), point_list[-1][1] - (j // (6 * i))))
print(point_list)
# print(len(point_list))
return point_list
4、代码文件
见文章顶部。