跳转至

矩阵变换

我们下标从 1 开始。 a 已读入,n 行 m 列,行列数为 1~100;a、b 是全局数组,类型为 int[110][110]。

矩阵转置

行列互换,n × m 转置后是 m × n。

原矩阵:
1 2 3
4 5 6

转置后:
1 4
2 5
3 6

只要求输出,可以改变遍历顺序。

for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
        cout << a[i][j] << ' ';
    }
    cout << '\n';
}

只改变输出顺序,a 没变。

盯住原位置,看它移动到哪里。

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
        b[j][i] = a[i][j];
    }
}

盯住新位置,看它从哪里来。

for (int i = 1; i <= m; i++) {
    for (int j = 1; j <= n; j++) {
        b[i][j] = a[j][i];
    }
}

选一种写法,结果存入 b,按 m 行 n 列输出。

向右旋转 90°(难)

这里用 n × n 的方阵。

盯住 a[i][j],看旋转到哪里。

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        b[j][n + 1 - i] = a[i][j];
    }
}

盯住 b[i][j],看从哪里来。

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        b[i][j] = a[n + 1 - j][i];
    }
}

选一种写法,结果存入 b,别覆盖原数组 a。

向左旋转,自己画一个小方阵,推一推位置关系。

要保存变换结果,就存入 b;只换输出顺序,a 不变。