观察几个旋转例子,就可以发现n*n矩阵有以下规律:
- 逆时针旋转90度:第i行变为第n-i+1列
- 顺时针旋转90度:第j列变为第n-j+1行
若矩阵二维数组a从0开始使用,则有:
- 逆时针旋转90度:a'[n-j-1][i]=a[i][j]
- 顺时针旋转90度:a'[j][n-i-1]=a[i][j]
对于有起始坐标偏移的旋转,再分别加上x、y偏移即可。
// // Created by Zed on 2024/2/15. // #include <iostream> using namespace std; const int MAXN = 15; const int INF = 1e7; int a[MAXN][MAXN]; void rotation(int op, int k, int x, int y) { int temp[MAXN][MAXN]; for (int i = 1; i <= 5; ++i) { for (int j = 1; j <= 5; ++j) { temp[i][j] = a[i][j]; } } if (op == 1) {//顺时针 for (int i = 0; i < k; ++i) { for (int j = 0; j < k; ++j) { temp[j + x][k - i - 1 + y] = a[i + x][j + y]; } } } else {//逆时针 for (int i = 0; i < k; ++i) { for (int j = 0; j < k; ++j) { temp[k - j - 1 + x][i + y] = a[i + x][j + y]; } } } for (int i = 1; i <= 5; ++i) { for (int j = 1; j <= 5; ++j) { a[i][j] = temp[i][j]; } } } int main() { while (true) { for (int i = 1; i < 6; ++i) { for (int j = 1; j < 6; ++j) { if (!(cin >> a[i][j])) { return 0; } } } int x, y, op1, op2; cin >> op1 >> op2 >> x >> y; rotation(op1, op2, x, y); for (int i = 1; i <= 5; ++i) { cout << a[i][1]; for (int j = 2; j <= 5; ++j) { cout << " " << a[i][j]; } cout << endl; } } }