You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),直接交换两个位置的元素
  • 奇数阶矩阵(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:13:12