矩阵旋转Python

代码

# 主要实现两种方式
# [
#     [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度 的旋转*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值