C++实现7×3二维数组按指定列优先重排打印的问题求助
矩阵列优先重排实现方案
原有代码问题
- 列抽取错误:剩余两列的抽取结果都写入了
pickUp2,未分存到不同数组,丢失了其中一列的数据 - 回写逻辑错误:第一次回写循环中额外执行了
index++,导致行遍历跳步;三个回写循环依次覆盖整个二维数组,最终仅保留最后一次写入的内容 - 设计思路错误:无需分三次回写不同数组,应先按规则拼接所有元素,再统一填充回二维数组
正确实现步骤
- 分别抽取原矩阵的三列,存入三个长度为7的一维数组
- 按规则拼接元素:选中的列排在最前,剩余两列按原列号从小到大排序后依次拼接,得到总长度为21的一维序列
- 按行优先规则(逐行从左到右填充)把拼接后的序列填入7行3列的新矩阵
- 打印新矩阵即可
修正后代码示例
#define ROWS 7 #define COLUMNS 3 // 入参说明:trickDeck为原7行3列矩阵,selected_col为用户选中的列号(从0开始计数) void rearrange_matrix(int trickDeck[ROWS][COLUMNS], int selected_col) { int col[3][ROWS]; // 存储3列的数组,col[0]存第0列,col[1]存第1列,col[2]存第2列 int temp[ROWS * COLUMNS]; // 存储拼接后的一维序列 int temp_idx = 0; // 1. 抽取所有列到对应数组 for (int i = 0; i < ROWS; i++) { col[0][i] = trickDeck[i][0]; col[1][i] = trickDeck[i][1]; col[2][i] = trickDeck[i][2]; } // 2. 按规则拼接:先放选中列,再放剩余两列(按列号升序) // 先放选中列 for (int i = 0; i < ROWS; i++) { temp[temp_idx++] = col[selected_col][i]; } // 放剩余两列 for (int i = 0; i < COLUMNS; i++) { if (i != selected_col) { for (int j = 0; j < ROWS; j++) { temp[temp_idx++] = col[i][j]; } } } // 3. 按行优先填充回二维数组 temp_idx = 0; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { trickDeck[i][j] = temp[temp_idx++]; } } // 4. 打印矩阵 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { printf("%2d ", trickDeck[i][j]); } printf("\n"); } }
列号适配说明
如果业务中用户输入的列号是从1开始计数,只需要在函数入口处添加selected_col = selected_col - 1;即可匹配逻辑。
内容的提问来源于stack exchange,提问作者SamSorcery
相关产品推荐
相关产品推荐

