如何实现矩阵多方向移位并插入新值、返回被挤出的末尾元素?
矩阵移位功能实现方案
核心逻辑说明
移位操作的通用逻辑可以拆解为:
- 先保存目标行/列的最后一个元素,就是要返回的被挤出值
- 从后往前遍历目标行/列,把前一个位置的元素赋值给后一个位置
- 把传入的新变量赋值给目标行/列的第一个位置
- 返回之前保存的被挤出元素
支持的四种操作类型:
- 行右移:指定某一行,元素整体向右移动一位,新元素插在行首,末尾元素被挤出(对应用户第一个示例)
- 行左移:指定某一行,元素整体向左移动一位,新元素插在行尾,首元素被挤出
- 列下移:指定某一列,元素整体向下移动一位,新元素插在列首,末尾元素被挤出(对应用户第二个示例)
- 列上移:指定某一列,元素整体向上移动一位,新元素插在列尾,首元素被挤出
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
相关产品推荐
相关产品推荐

