代码
# 主要实现两种方式
# [
# [1,2,3], (0,0),(0,1),(0,2),(0,3),(0,4),(0,5) length=6 max_xy=5
# [4,5,6], (1,0),(1,1),(1,2),(1,3),(1,4),(1,5)
# [7,8,9] (2,0),(2,1),(2,2),(2,3),(2,4),(2,5)
# ] (3,0),(3,1),(3,2),(3,3),(3,4),(3,5)
# (4,0),(4,1),(4,2),(4,3),(4,4),(4,5),
# (5,0),(5,1),(5,2),(5,3),(5,4),(5,5),
# 生成矩阵
def ger_matrix(dim: int):
start = 1
while start <= dim * dim:
row = []
while len(row) < dim:
row.append(start)
start += 1
yield row
##### 1 ####
def ger_colmun(nn: int, dst: list) -> list:
l = len(dst) - 1
while l >= 0:
yield dst[l][nn]
l -= 1
# 顺时针旋转90度后,行列进行对应互换,第一行变成最后一列。。。最后一行变成第一列
def rotate_list(tar: list) -> list:
if len(tar) == 0:
return
array_1 = len(tar[0])
for ai in range(array_1):
yield list(ger_colmun(ai, tar))
#############
##### 2 #####
# 不创建任何新的container,采用旋转交换法
def pos_exchange(dst: list, val: int, max_xy: int, x_last=0, y_last=0, x_origin=0, y_origin=0)-> bool:
start_pos_x, start_pos_y = y_last, abs(x_last - max_xy) # 计算移位到的坐标
old, dst[start_pos_x][start_pos_y] = dst[start_pos_x][start_pos_y], val
if start_pos_x == x_origin and start_pos_y == y_origin:
if y_origin + 1 > max_xy - 1 - x_origin: # 本圈结束
return True
y_origin += 1
start_pos_x, start_pos_y, old = x_origin, y_origin, dst[x_origin][y_origin]
pos_exchange(dst, old, max_xy, x_last=start_pos_x, y_last=start_pos_y, x_origin=x_origin, y_origin=y_origin)
def rotate(tar: list):
circle = len(tar) // 2 # 计算旋转圈数
max_xy = len(tar) - 1 # 计算最大x, y 坐标
for c in range(circle): # 遍历交换每一圈
pos_exchange(tar, tar[c][c], max_xy, x_last=c, y_last=c, x_origin=c, y_origin=c)
def pretty_print(tar: list):
for t in tar:
print(t)
if __name__ == "__main__":
dlist = list(ger_matrix(10))
pretty_print(dlist)
rotate(dlist)
print("##########")
pretty_print(dlist)
# pretty_print(list(rotate_list(dlist)))
实现旋转90度,稍加改动,可以变换任一 X 90度 的旋转*