Python实现N*N矩阵多次90度旋转的代码问题排查
排查N×N矩阵多次90度旋转无效问题(3阶矩阵示例)
你的核心问题是:通过元素1的位置计算旋转次数num1,调用rotate90后3阶矩阵输出与原矩阵一致,未达到预期。问题大概率出在旋转次数计算逻辑错误或**rotate90函数本身的旋转逻辑错误**,以下是具体排查和修复方向:
1. 先验证rotate90函数的正确性
很多时候旋转函数的实现会混淆坐标映射,导致旋转无效或方向错误。先单独测试这个函数,排除基础逻辑问题:
错误的常见实现(比如用列表移位代替矩阵旋转)
def rotate90(flat_list, N): # 错误:直接移位不是矩阵旋转,3阶矩阵调用后会变成[7,8,9,1,2,3,4,5,6],完全不符合90度旋转 return flat_list[-N:] + flat_list[:-N]
正确的实现(两种方式)
方式1:基于扁平化列表的坐标映射
def rotate90(flat_list, N): rotated = [0] * (N*N) for i in range(N): for j in range(N): # 顺时针90度:原矩阵(i,j) → 旋转后(j, N-1 -i) # 转换为扁平化索引:原索引=i*N+j,旋转后索引=j*N + (N-1 -i) rotated[j*N + (N-1 -i)] = flat_list[i*N + j] return rotated
方式2:先转回矩阵再旋转(逻辑更直观)
def rotate90(flat_list, N): # 扁平化列表转回N×N矩阵 matrix = [flat_list[i*N : (i+1)*N] for i in range(N)] # 顺时针旋转90度:利用zip和列表反转 rotated_matrix = list(zip(*matrix[::-1])) # 重新扁平化 return [elem for row in rotated_matrix for elem in row]
测试时,给一个已知矩阵的扁平化列表:
test_flat = [1,2,3,4,5,6,7,8,9] print(rotate90(test_flat, 3)) # 预期输出:(7,4,1,8,5,2,9,6,3)(顺时针旋转90度后的扁平化结果)
如果输出不符合预期,优先修复rotate90函数。
2. 检查旋转次数num1的计算逻辑
如果rotate90函数没问题,那就是num1的计算错误(比如算成0或4的倍数,因为旋转4次矩阵会回到原位)。
核心逻辑:元素1的位置映射关系
以3阶矩阵为例,每次顺时针旋转90度后,元素1的扁平化索引变化为:
- 旋转0次:索引0(原位置(0,0))
- 旋转1次:索引2(位置(0,2))
- 旋转2次:索引8(位置(2,2))
- 旋转3次:索引6(位置(2,0))
- 旋转4次:回到索引0
如果你的预期是旋转1次,但计算出的num1是0,那自然输出原矩阵。常见错误点:
- 混淆了矩阵坐标与扁平化索引的映射关系(比如把
i*N+j写成j*N+i) - 反推旋转次数时方向搞反(比如用逆时针的位置变化来计算顺时针的次数)
- 计算时取模错误(比如对3取模而不是对4取模,因为旋转4次循环)
验证方法
在代码中打印关键变量:
flat_list = [你的输入扁平化列表] current_pos = flat_list.index(1) target_pos = 你预期元素1的扁平化索引 num1 = 你的计算结果 print(f"当前位置:{current_pos},预期位置:{target_pos},计算旋转次数:{num1}")
如果num1是0或4的倍数,直接修改计算逻辑即可。
3. 排查流程总结
- 单独测试
rotate90函数,确保单次旋转输出符合预期 - 打印
num1的计算过程,确认次数是否匹配需求 - 若旋转次数正确但结果仍不对,检查是否在旋转后没有更新扁平化列表(比如每次旋转后没有把结果赋值给原列表,导致重复旋转原列表)
内容的提问来源于stack exchange,提问作者Ibrahim Kasim
相关产品推荐
相关产品推荐

