Matrix

本文介绍了如何编程实现一个N×N的矩阵根据用户指定次数进行顺时针旋转90度或者逆时针旋转90度,以及进行以中心对称的元素交换操作。给出了输入输出样例及注意事项。
摘要由CSDN通过智能技术生成

Problem Description
Veggie 最近深深地迷恋上了 Matrix,现在他手上有一个 N × N 的矩阵,矩阵中的元素都是数字,他希望可以从不同角度欣赏矩阵之美。但是 Veggie 道行尚浅,只能请求好友 SLF 帮他完成对矩阵的变换,矩阵的变换法则如下:
法则 1:将矩阵顺时针旋转 90 度,例如:
1 2 3 7 4 1
4 5 6 → 8 5 2
7 8 9 9 6 3
法则 2:将矩阵逆时针旋转 90 度,例如:
1 2 3 3 6 9
4 5 6 → 2 5 8
7 8 9 1 4 7
法则 3:矩阵的中央元素不变,将其他元素与 “以中央元素为中心对称的元素” 互换,例如:
1 2 3 9 8 7
4 5 6 → 6 5 4
7 8 9 3 2 1
不料 SLF 二话不说把这个差事安排给了你,现在请你编程帮 Veggie 完成矩阵的变换。

Input
第一行输入正整数 N(N 为奇数,且1 ≤ N ≤ 25)和 M(0 ≤ M ≤ 20) 中间以空格隔开,其中 N 如题目,M 表示矩阵变换的次数。
接下来 N 行,每行输入 N 个在 int 类型范围内的整数,中间以空格隔开,表示矩阵的各元素。
最后 M 行,每行输入一个整数 t(1 ≤ t ≤ 3),表示要进行变换的法则编号。

Output
输出每次变换后的矩阵,每次输出完需要多打印一个空行。(详情可以参照输出样例 1)
注意:每输入一个变换法则编号,视为一次变换
注意:行末多余空格会影响正确答案!
Sample Input 1
3 2
1 2 3
4 5 6
7 8 9
2
3

Sample Output 1
3 6 9
2 5 8
1 4 7

7 4 1
8 5 2
9 6 3

#include <cstdio>
using namespace std;
void reori(int(&a)[30][30], int(&b)[30][30], int n) {
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j < n; ++j)
        {
            a[i][j] = b[i][j];
            b[i][j] = 0;
        }
    }
}

void outmatrix(int(&a)[30][30], int n) {
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j < n; ++j) {
            printf("%d ", a[i][j]);
            if (j == n - 1) {
                printf("\n");
            }
        }
    }
    printf("\n");
}



int main() {
    int n, m, num, method;
    int matrix[30][30] = { 0 };
    int temp[30][30] = { 0 };
    scanf_s("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            scanf_s("%d", &num);
           
            matrix[i][j] = num;
            
            
        }
    }
    
    while (m--) {
        scanf_s("%d", &method);

        if (method == 1) {
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= n; ++j) {
                    temp[j][n + 1 - i] = matrix[i][j];
                }
            }
            reori(matrix, temp, n + 1);
            outmatrix(matrix, n + 1);
        }
         if (method == 2) {
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= n; ++j) {
                    temp[n + 1 - j][i] = matrix[i][j];
                }
            }
            reori(matrix, temp, n + 1);
            outmatrix(matrix, n + 1);
        }

         if (method == 3) {
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= n; ++j) {
                    if (i == (n + 1) / 2 && j == (n + 1) / 2) {
                        temp[i][j] = matrix[i][j];
                    }
                    else if (i != (n + 1) / 2 && j != (n + 1) / 2) {
                        temp[n + 1 - i][n + 1 - j] = matrix[i][j];
                    }
                    else if (i != (n + 1) / 2 && j == (n + 1) / 2) {
                        temp[n + 1 - i][j] = matrix[i][j];
                    }
                    else if (i == (n + 1) / 2 && j != (n + 1) / 2) {
                        temp[i][n + 1 - j] = matrix[i][j];
                    }
                }
            }
            reori(matrix, temp, n + 1);
            outmatrix(matrix, n + 1);
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值