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

如何实现矩阵多方向移位并插入新值、返回被挤出的末尾元素?

矩阵移位功能实现方案

核心逻辑说明

移位操作的通用逻辑可以拆解为:

  1. 先保存目标行/列的最后一个元素,就是要返回的被挤出值
  2. 从后往前遍历目标行/列,把前一个位置的元素赋值给后一个位置
  3. 把传入的新变量赋值给目标行/列的第一个位置
  4. 返回之前保存的被挤出元素

支持的四种操作类型:

  • 行右移:指定某一行,元素整体向右移动一位,新元素插在行首,末尾元素被挤出(对应用户第一个示例)
  • 行左移:指定某一行,元素整体向左移动一位,新元素插在行尾,首元素被挤出
  • 列下移:指定某一列,元素整体向下移动一位,新元素插在列首,末尾元素被挤出(对应用户第二个示例)
  • 列上移:指定某一列,元素整体向上移动一位,新元素插在列尾,首元素被挤出

C++完整实现代码

#include <iostream>
using namespace std;

// 全局矩阵,也可以改成参数传入
int matrix[3][3] = {  
    {0, 1, 2},   
    {3, 4, 5},   
    {6, 7, 8}   
};

// 行右移:参数为行号(0~2)、新插入的元素,返回被挤出的元素
int shiftRowRight(int rowIdx, int newVal) {
    int popped = matrix[rowIdx][2];
    // 从后往前赋值避免元素覆盖丢失
    for (int i = 2; i > 0; i--) {
        matrix[rowIdx][i] = matrix[rowIdx][i-1];
    }
    matrix[rowIdx][0] = newVal;
    return popped;
}

// 行左移:参数为行号(0~2)、新插入的元素,返回被挤出的元素
int shiftRowLeft(int rowIdx, int newVal) {
    int popped = matrix[rowIdx][0];
    for (int i = 0; i < 2; i++) {
        matrix[rowIdx][i] = matrix[rowIdx][i+1];
    }
    matrix[rowIdx][2] = newVal;
    return popped;
}

// 列下移:参数为列号(0~2)、新插入的元素,返回被挤出的元素
int shiftColDown(int colIdx, int newVal) {
    int popped = matrix[2][colIdx];
    for (int i = 2; i > 0; i--) {
        matrix[i][colIdx] = matrix[i-1][colIdx];
    }
    matrix[0][colIdx] = newVal;
    return popped;
}

// 列上移:参数为列号(0~2)、新插入的元素,返回被挤出的元素
int shiftColUp(int colIdx, int newVal) {
    int popped = matrix[0][colIdx];
    for (int i = 0; i < 2; i++) {
        matrix[i][colIdx] = matrix[i+1][colIdx];
    }
    matrix[2][colIdx] = newVal;
    return popped;
}

// 打印矩阵工具函数
void printMatrix() {
    for (int i = 0; i < 3; i++) {
        cout << "[";
        for (int j = 0; j < 3; j++) {
            cout << matrix[i][j];
            if (j != 2) cout << ",";
        }
        cout << "]" << endl;
    }
}

int main()
{
    cout << "初始矩阵:" << endl;
    printMatrix();
    
    // 测试第一个示例:第一行行右移,新元素为5
    int popped1 = shiftRowRight(0, 5);
    cout << endl << "第一行行右移插入5后,被挤出元素:" << popped1 << endl;
    cout << "移位后矩阵:" << endl;
    printMatrix();
    
    // 测试第二个示例:最后一列(列号2)列下移,新元素为6
    int popped2 = shiftColDown(2, 6);
    cout << endl << "第2列列下移插入6后,被挤出元素:" << popped2 << endl;
    cout << "移位后矩阵:" << endl;
    printMatrix();

    return 0;
}

运行结果验证

初始矩阵:
[0,1,2]
[3,4,5]
[6,7,8]

第一行行右移插入5后,被挤出元素:2
移位后矩阵:
[5,0,1]
[3,4,5]
[6,7,8]

第2列列下移插入6后,被挤出元素:8
移位后矩阵:
[5,0,6]
[3,4,1]
[6,7,5]

和你给出的示例逻辑完全匹配,你原代码的问题主要是没有区分行列操作、变量名拼写错误(tmp和temp不匹配),也没有先保存被挤出的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:03