二维数组学习指南

二维数组学习指南(行列从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++;
    }
}

四、常见错误与调试技巧

  1. 数组越界:确保循环边界正确(使用<=n而不是<n

  2. 初始化问题:明确行列从1开始,0行/0列通常不使用

  3. 边界条件:特别注意n=1或m=1的情况

  4. 调试建议:

    • 先打印小矩阵(如3×3)验证

    • 使用cout在关键位置输出中间结果

    • 检查对角线公式是否正确(特别是辅对角线)

五、实战练习建议

  1. 从简单矩阵操作开始(输入输出、加减法)

  2. 练习对角线相关题目

  3. 掌握至少两种旋转方法

  4. 尝试实现特殊遍历(Z字形、螺旋形)

  5. 最后挑战矩阵前缀和等高级应用

posted @ 2025-05-27 14:57  CRt0729  阅读(19)  评论(0)    收藏  举报