题解 | #C翻转#

C翻转

https://www.nowcoder.com/practice/a591300637874f6ba2316a5fe3e94579

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务