A23254. 矩阵圈层90度交错旋转
填空题
较难
知识点
题目描述
矩阵圈层90度交错旋转
题目描述
给定一个n x n的二维整数矩阵,你需要对这个矩阵的每一“圈层”的元素进行交错旋转,规则如下:
圈层的定义:
- 矩阵从最外层开始,向内逐层定义“圈层”。最外层的元素构成第一圈层,移除最外层后剩余矩阵的最外层元素构成第二圈层,以此类推。
- 如果n为奇数,最中心的一个元素属于最内层的圈层,且旋转后其值不改变。
旋转方向:
- 最外层(第一圈层)的元素按照顺时针方向整体旋转90度。
- 次外层(第二圈层)的元素按照逆时针方向整体旋转90度。
- 再往内一层(第三圈层)的元素按照顺时针方向整体旋转90度。
以此类推,圈层的旋转方向在顺时针和逆时针之间交替进行。
旋转范围:
每一圈层的旋转仅限于该圈层内的元素。
例:一个6x6矩阵的圈层和旋转方向定义如下

例:当n=4,原始矩阵经过圈层交错旋转后结果如下

输入描述
第一行输入一个正整数n(2≤n≤100),表示矩阵的行数和列数;接下来n行,每行输入n个整数(-1000≤整数≤1000),整数之间以一个空格隔开。
输出描述
输出n行,每行n个整数,整数之间以一个空格隔开,表示经过圈层交错旋转90度变换后的矩阵。
样例输入
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16样例输出
13 9 5 1
14 7 11 2
15 6 10 3
16 12 8 4参考答案
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], b[N][N], c[N][N], n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
// 生成顺时针旋转 90 度后的矩阵 b
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
// 顺时针旋转 90 度的坐标变换:原矩阵的(n - j + 1, i)位置元素到新矩阵(i, j)位置
b[i][j] = a[n - j + 1][i];
// 生成逆时针旋转 90 度后的矩阵 c
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
// 逆时针旋转 90 度的坐标变换:原矩阵的(j, n - i + 1)位置元素到新矩阵(i, j)位置
c[i][j] = a[j][n - i + 1];
// 遍历矩阵,根据圈层奇偶性输出对应旋转后的结果
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// 计算当前位置所在圈层(t 值越小,圈层越靠外,t=1 是最外层)
int t = min(i, j, n - i + 1, n - j + 1);
if (t % 2) {
// 奇数圈层(第一、三...圈层),输出顺时针旋转后的矩阵 b 对应位置元素
cout << b[i][j] << ' ';
} else {
// 偶数圈层(第二、四...圈层),输出逆时针旋转后的矩阵 c 对应位置元素
cout << c[i][j] << ' ';
}
}
cout << endl;
}
return 0;
}
上一题
下一题