将正方形矩阵顺时针旋转90度

将正方形矩阵顺时针旋转90度

题目描述

给定一个n*n的矩阵matrix,请把这个矩阵顺时针转动90度。

输入描述:

输入包含多行,第一行一个整数 n ( 1 ≤ n ≤ 200 ) n(1 \leq n \leq 200) n(1n200),代表矩阵的行数和列数,接下来n行,每行n个整数,代表矩阵 m a t r i x ( 1 ≤ m a t r i x [ i ] [ j ] ≤ 40000 ) matrix(1 \leq matrix[i][j] \leq 40000) matrix(1matrix[i][j]40000)

输出描述:

输出旋转后的矩阵(包含n行,每行n个数)。

示例1
输入
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
备注:

额外空间复杂度 O ( 1 ) O(1) O(1)


题解:

仍然分层处理,使用左上角和右下角两个点表示一个子矩阵。比如在样例中,左上角为(0,0),右下角为(3,3)就可以表示整个矩阵。其最外层如下:

1   2   3    4

5               8

9             12

13 14 15 16

在这层中,1,4,16,13为一组,依次互换位置,即调整完一组。然后是 2,8,15,9,等等。该层调整完成后,继续下一层调整,直到整个矩阵被处理完毕。

代码:
#include <cstdio>

using namespace std;

const int N = 200;

int n;
int a[N][N];

int main(void) {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        for( int j = 0; j < n; ++j)
            scanf("%d", a[i] + j);
    }
    int tr = 0, tc = 0;
    int dr = n - 1, dc = n - 1;
    int tmp, num;
    while (tr < dr) {
        num = dc - tc; // 该层有多少组
        for (int i = 0; i < num; ++i) {
            tmp = a[tr][tc + i];
            a[tr][tc + i] = a[dr - i][tc];
            a[dr - i][tc] = a[dr][dc - i];
            a[dr][dc - i] = a[tr + i][dc];
            a[tr + i][dc] = tmp;
        }
        ++tr, ++tc;
        --dr, --dc;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j)
            printf("%d%c", a[i][j], " \n"[j == n - 1]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值