n×n矩阵右上角与左下角方块原地交换实现问询
原地交换n×n矩阵的右上角与左下角方块
问题说明
给定一个n×n矩阵(限制为10×10),需原地交换右上角和左下角区域的方块,且不能使用额外空间。需根据矩阵大小的奇偶性采用不同处理逻辑。
示例展示
示例1(4×4偶数阶矩阵)
输入矩阵:
0 3 1 2 9 2 3 4 5 6 5 7 7 8 9 9
交换后结果:
0 3 5 6 9 2 7 8 1 2 5 7 3 4 9 9
示例2(5×5奇数阶矩阵)
输入矩阵:
1 2 3 4 5 6 7 8 9 1 3 8 7 5 0 3 1 7 8 5 7 4 3 6 7
交换2×2方块后结果:
1 2 3 3 1 6 7 8 7 4 3 8 7 5 0 4 5 7 8 5 9 1 3 6 7
索引映射规则
正确的方块交换需要对应索引的偏移映射,以4×4矩阵为例:
[0][2] ↔ [2][0] [0][3] ↔ [2][1] [1][2] ↔ [3][0] [1][3] ↔ [3][1]
现有代码问题
当前代码仅实现了m[i][j]与m[j][i]的直接交换,未处理方块区域的索引偏移,无法完成正确的区域交换:
def Swap4(m,r): k = r//2 if r % 2 != 0: for i in range(0, k): for j in range(k+1, r): t = m[i][j] m[i][j] = m[j][i] m[j][i] = t else: for i in range(0, k): for j in range(k, r): t = m[i][j] m[i][j] = m[j][i] m[j][i] = t
优化后的代码
def Swap4(m, r): k = r // 2 if r % 2 != 0: # 奇数阶矩阵:处理前k行、后k列 与 后k行、前k列的交换 for i in range(k): for j in range(k + 1, r): target_i = k + 1 + i target_j = j - (k + 1) m[i][j], m[target_i][target_j] = m[target_i][target_j], m[i][j] else: # 偶数阶矩阵:处理前k行、后k列 与 后k行、前k列的交换 for i in range(k): for j in range(k, r): target_i = k + i target_j = j - k m[i][j], m[target_i][target_j] = m[target_i][target_j], m[i][j]
代码解释
- 偶数阶矩阵(r为偶数):
- 右上角区域是前k行(
0~k-1)、后k列(k~r-1);左下角区域是后k行(k~r-1)、前k列(0~k-1) - 右上角位置
(i,j)对应的左下角位置为(k+i, j-k),直接交换两个位置的元素
- 右上角区域是前k行(
- 奇数阶矩阵(r为奇数):
- 中间行/列(第k行、第k列)无需处理
- 右上角区域是前k行(
0~k-1)、后k列(k+1~r-1);左下角区域是后k行(k+1~r-1)、前k列(0~k-1) - 右上角位置
(i,j)对应的左下角位置为(k+1+i, j-(k+1)),交换两个位置的元素
内容的提问来源于stack exchange,提问作者burnn1k
相关产品推荐
相关产品推荐

