二维数组学习指南
二维数组学习指南(行列从1开始版本)
一、二维数组基础(行列从1开始)
1. 声明与初始化
int matrix[101][101]; // 行和列都从1开始使用 memset(matrix, 0, sizeof(matrix)); // 初始化
2. 输入输出模板
// 输入n行m列矩阵 for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin >> matrix[i][j]; // 输出n行m列矩阵 for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++) cout << matrix[i][j] << " "; cout << endl; }
二、核心操作模板
1. 矩阵运算
矩阵加法
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) c[i][j] = a[i][j] + b[i][j];
矩阵减法
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) c[i][j] = a[i][j] - b[i][j];
2. 对角线操作
主对角线(左上→右下)
for(int i=1; i<=n; i++) sum += matrix[i][i];
辅对角线(右上→左下)
for(int i=1; i<=n; i++) sum += matrix[i][n+1-i]; // 关键公式:i+j = n+1
3. 矩阵旋转
顺时针90度
for(int j=1; j<=m; j++){ for(int i=n; i>=1; i--) cout << matrix[i][j] << " "; cout << endl; }
逆时针90度
for(int j=m; j>=1; j--){ for(int i=1; i<=n; i++) cout << matrix[i][j] << " "; cout << endl; }
三、特殊问题解决方案
1. Z字形遍历求和
int sum = 0; // 第一行和最后一行 for(int j=1; j<=m; j++) sum += matrix[1][j] + matrix[n][j]; // 辅对角线 for(int i=1; i<=n; i++) sum += matrix[i][m+1-i]; // 减去重复计算的两个交点 sum -= matrix[1][m] + matrix[n][1];
2. 螺旋矩阵生成
int num = 1, top = 1, bottom = n, left = 1, right = m; while(top <= bottom && left <= right){ // 从左到右 for(int j=left; j<=right; j++) matrix[top][j] = num++; top++; // 从上到下 for(int i=top; i<=bottom; i++) matrix[i][right] = num++; right--; // 从右到左 if(top <= bottom){ for(int j=right; j>=left; j--) matrix[bottom][j] = num++; bottom--; } // 从下到上 if(left <= right){ for(int i=bottom; i>=top; i--) matrix[i][left] = num++; left++; } }
四、常见错误与调试技巧
-
数组越界:确保循环边界正确(使用
<=n而不是<n) -
初始化问题:明确行列从1开始,0行/0列通常不使用
-
边界条件:特别注意n=1或m=1的情况
-
调试建议:
-
先打印小矩阵(如3×3)验证
-
使用
cout在关键位置输出中间结果 -
检查对角线公式是否正确(特别是辅对角线)
-
五、实战练习建议
-
从简单矩阵操作开始(输入输出、加减法)
-
练习对角线相关题目
-
掌握至少两种旋转方法
-
尝试实现特殊遍历(Z字形、螺旋形)
-
最后挑战矩阵前缀和等高级应用

浙公网安备 33010602011771号