c++信奥二维数组矩阵方面题解 📅 2026/7/24 4:10:40 以下是二维数组中常见位置判断条件的整理假设矩阵大小为n×n行列索引从0开始两条对角线// 主对角线左上→右下ij// 副对角线右上→左下ijn-1// 两条对角线同时判断ij||ijn-1 当n为奇数时两条对角线在中心点(n/2, n/2)相交该元素只会被加一次用||天然去重。上三角与下三角// 上三角含主对角线i j// 下三角含主对角线i j// 上三角不含主对角线i j// 下三角不含主对角线i j用图来理解n5*表示满足条件的位置上三角(ij) 下三角(ij) 上三角(ij) 下三角(ij) * * * * * * . . . . . * * * * . . . . . . * * * * * * . . . . . * * * * . . . . . . * * * * * * . . . . . * * * * . . . . . . * * * * * * . . . . . * * * * . . . . . . * * * * * * . . . . . * * * * .矩阵边界// 第一行i0// 最后一行in-1// 第一列j0// 最后一列jn-1// 四条边外圈i0||in-1||j0||jn-1常见组合应用// 只加主对角线不加副对角线if(ijij!n-1)// 只加副对角线不加主对角线if(ijn-1i!j)// 上三角元素加10if(ij)// 边界元素加10if(i0||in-1||j0||jn-1)// 非边界元素内部元素if(i0in-1j0jn-1)速查表位置条件主对角线i j副对角线i j n - 1上三角含对角线i j下三角含对角线i j上三角不含对角线i j下三角不含对角线i j四条边i0 || in-1 || j0 || jn-1内部元素i0 in-1 j0 jn-1掌握这些条件后大部分矩阵位置判断题都可以直接套用了。题目一副对角线求和题目描述输入一个n×nn \times nn×n的矩阵计算并输出该矩阵副对角线上所有元素的和。考察重点副对角线的判断条件i j n - 1。示例输入31 2 34 5 67 8 9输出15 因为 3 5 7 15题目二矩阵内圈元素置零题目描述输入一个n×nn \times nn×n的矩阵n≥3n \ge 3n≥3将矩阵最外圈边界的元素保持不变将内部元素全部变为 0并输出新矩阵。考察重点内部元素的判断条件i 0 i n - 1 j 0 j n - 1。示例输入41 1 1 12 2 2 23 3 3 34 4 4 4输出1 1 1 12 0 0 23 0 0 34 4 4 4题目三上三角元素翻倍题目描述输入一个n×nn \times nn×n的矩阵将矩阵的**上三角区域包含主对角线**的所有元素值乘以 2其余元素保持不变输出新矩阵。考察重点上三角含对角线的判断条件i j。示例输入31 2 34 5 67 8 9输出2 4 64 10 127 8 9题目四对角线合并与三角区排除题目描述输入一个n×nn \times nn×n的矩阵将两条对角线上的元素都加上 10但不包含主对角线和副对角线交叉的中心点如果nnn为奇数中心点只加一次此题要求中心点不加输出新矩阵。考察重点组合条件的运用。主对角线i j副对角线i j n - 1排除中心点。示例输入31 1 11 1 11 1 1输出11 1 111 1 111 1 11这几道题的难度刚好覆盖了常见的矩阵位置判断。以下是四道题的参考代码题目一副对角线求和#includeiostreamusingnamespacestd;intmain(){intn,sum0;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];for(inti0;in;i)for(intj0;jn;j)if(ijn-1)sumarr[i][j];coutsumendl;return0;}题目二矩阵内圈元素置零#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];for(inti0;in;i){for(intj0;jn;j){if(i0in-1j0jn-1)arr[i][j]0;coutarr[i][j] ;}coutendl;}return0;}题目三上三角元素翻倍#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];for(inti0;in;i){for(intj0;jn;j){if(ij)arr[i][j]*2;coutarr[i][j] ;}coutendl;}return0;}题目四对角线加10但排除中心点#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];for(inti0;in;i){for(intj0;jn;j){// 在对角线上且不是中心点boolonDiagonal(ij)||(ijn-1);boolisCenter(n%21)(in/2)(jn/2);if(onDiagonal!isCenter)arr[i][j]10;coutarr[i][j] ;}coutendl;}return0;}各题核心逻辑对照题目核心条件题一i j n - 1题二i 0 i n-1 j 0 j n-1题三i j题四(i j || i j n-1) !isCenter下面给出几道进阶矩阵题及其参考代码题目一矩阵顺时针旋转90度题目描述输入一个n×nn \times nn×n的矩阵将其顺时针旋转90度后输出。思路先沿主对角线翻转转置再左右翻转每行。#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];// 第一步转置沿主对角线翻转for(inti0;in;i)for(intji1;jn;j)swap(arr[i][j],arr[j][i]);// 第二步每行左右翻转for(inti0;in;i)for(intj0;jn/2;j)swap(arr[i][j],arr[i][n-1-j]);// 输出for(inti0;in;i){for(intj0;jn;j)coutarr[i][j] ;coutendl;}return0;}示例输入3 1 2 3 4 5 6 7 8 9输出7 4 1 8 5 2 9 6 3题目二螺旋遍历矩阵题目描述输入一个n×nn \times nn×n的矩阵按顺时针螺旋顺序输出所有元素。思路设定上下左右四个边界依次遍历上边→右边→下边→左边每遍历完一条边就收缩对应边界。#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];inttop0,bottomn-1,left0,rightn-1;while(topbottomleftright){// 上边从左到右for(intjleft;jright;j)coutarr[top][j] ;top;// 右边从上到下for(intitop;ibottom;i)coutarr[i][right] ;right--;// 下边从右到左if(topbottom){for(intjright;jleft;j--)coutarr[bottom][j] ;bottom--;}// 左边从下到上if(leftright){for(intibottom;itop;i--)coutarr[i][left] ;left;}}coutendl;return0;}示例输入3 1 2 3 4 5 6 7 8 9输出1 2 3 6 9 8 7 4 5题目三矩阵转置题目描述输入一个n×nn \times nn×n的矩阵输出它的转置矩阵行列互换。思路沿主对角线交换arr[i][j]和arr[j][i]。#includeiostreamusingnamespacestd;intmain(){intn;cinn;intarr[25][25];for(inti0;in;i)for(intj0;jn;j)cinarr[i][j];// 沿主对角线翻转for(inti0;in;i)for(intji1;jn;j)swap(arr[i][j],arr[j][i]);// 输出for(inti0;in;i){for(intj0;jn;j)coutarr[i][j] ;coutendl;}return0;}示例输入3 1 2 3 4 5 6 7 8 9输出1 4 7 2 5 8 3 6 9各题核心技巧对照题目核心技巧顺时针旋转90°转置 每行左右翻转螺旋遍历四个边界变量top/bottom/left/right逐步收缩矩阵转置沿主对角线交换arr[i][j]与arr[j][i]小贴士旋转90°的本质是转置翻转记住这个套路后逆时针旋转90°就是转置上下翻转180°旋转就是上下翻转左右翻转。