观察几个旋转例子,就可以发现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;
}
}
}

京公网安备 11010502036488号