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

如何将矩形矩阵反对角线上的负元素前移?该操作是否可行?

结论:这个操作完全可以实现

首先我们把原矩阵和目标矩阵的结构拆解开,看得更直观:

原矩阵(3行4列)

行0: [1, 2, -3, 4]
行1: [5, -6, 7, 8]
行2: [9, 1, 2, 3]

目标矩阵

行0: [1, 2, 9, 4]
行1: [5, -3, 7, 8]
行2: [-6, 1, 2, 3]

关键分析:定位目标反对角线

观察元素变化:-3从位置(0,2)移到(1,1),-6从(1,1)移到(2,0),9从(2,0)移到(0,2)。这三个位置满足行索引 + 列索引 = 2,属于同一条从右上延伸到左下的反对角线。

题目里说的“反对角线上的负元素沿反对角线前移”,结合目标矩阵的结果来看,实际是把这条对角线上的非负元素移到对角线的最右上位置,负元素依次沿着对角线向左下方向排列。

实现思路(以C语言为例)

我们可以通过以下几步完成这个操作:

  1. 提取目标反对角线上的所有元素,存入临时数组;
  2. 把临时数组里的负元素和非负元素分开;
  3. 按照「非负元素在前,负元素保留原顺序跟在后面」的规则重组临时数组;
  4. 将重组后的元素依次放回原矩阵的对应反对角线位置。

示例代码

#include <stdio.h>

int main() {
    int arr[3][4] = {1,2,-3,4, 5,-6,7,8, 9,1,2,3};
    int temp[3];
    int negatives[2], non_negatives[1];
    int neg_idx = 0, non_neg_idx = 0;

    // 提取反对角线元素(满足i+j=2)
    temp[0] = arr[0][2];
    temp[1] = arr[1][1];
    temp[2] = arr[2][0];

    // 分离负元素和非负元素
    for (int i = 0; i < 3; i++) {
        if (temp[i] < 0) {
            negatives[neg_idx++] = temp[i];
        } else {
            non_negatives[non_neg_idx++] = temp[i];
        }
    }

    // 重组临时数组:非负元素在前,负元素按原顺序跟进
    temp[0] = non_negatives[0];
    temp[1] = negatives[0];
    temp[2] = negatives[1];

    // 将重组后的元素放回原矩阵
    arr[0][2] = temp[0];
    arr[1][1] = temp[1];
    arr[2][0] = temp[2];

    // 打印验证结果
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

运行这段代码后,输出的矩阵就和题目中的目标矩阵完全一致。

内容的提问来源于stack exchange,提问作者Yutat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:42:46