思路
矩阵的顺时针(向右)旋转基本有四种情况:
- 0度
- 90度
- 180度
- 270度,相当于逆向的90度
90度旋转
列号变为行号
- (n - 行号 + 1)变成列号
- 规律: a[i][j] = b[j][n - i + 1]
180度旋转- (n - 行号 + 1)变为行号
- (n - 列号 + 1)变为列号
- 规律:a[i][j] = b[n - i + 1][n - j + 1]
270度旋转(相当于逆时针旋转90度)
- 行号变为列号
- (n - 列号 + 1)变为行号
- 规律:a[i][j] = b[n - j + 1][i]
题目描述
小劉现在有一些矩阵,现在他认为这些矩阵不好看,想要扭转一下,有些矩阵左右扭转完就变好看了,有些矩阵上下扭转完变好看了,有些矩阵既要左右扭转,也要上下扭转才会变好看,左右扭转的含义是将整个矩阵左右反转,上下扭转的含义是将整个矩阵上下反转,现在你需要帮助小劉输出反转后的矩阵。
输入描述
第一行一个数字t,表示有t组样例(1<=t<=103)
接下来每组样例中
第一行一个数字k,表示需要的扭转操作(数字1表示左右扭转,数字2表示上下扭转,数字3表示既要左右扭转,也要上下扭转)
第二行两个数字n,m,分别表示矩阵的行数和列数(1<=n,m<=100)
接下来n行,每一行都有m个数字,(1<=每个数字<=1018)输出描述
输出扭转后的矩阵,每个矩阵最后多加一个空行
样例输入
3 1 3 3 1 2 3 2 3 4 3 4 5 2 3 3 1 2 3 2 3 4 3 4 5 3 3 3 1 2 3 2 3 4 3 4 5样例输出
3 2 1 4 3 2 5 4 33 4 5 2 3 4 1 2 35 4 3 4 3 2 3 2 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;int a[1010][1010];
int b[1010][1010];
int main() {int q;scanf("%d", &q);while (q--){int k, n, m;scanf("%d%d%d", &k, &n, &m);for (int i = 0; i < n; i++){for (int j = 0; j < m; j++)scanf("%d", &a[i][j]);}if (k == 1){for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){b[i][m - j - 1] = a[i][j];}}}if (k == 2){for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){b[n - i - 1][j] = a[i][j];}}}if (k == 3){for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){b[n - i - 1][m - j - 1] = a[i][j];}}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){printf("%d ", b[i][j]);}printf("\n");}printf("\n");}return 0;
}