测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题