题目描述

首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。 操作类型有四种:  1 2 表示:90度,顺时针,翻转4个数  1 3 表示:90度,顺时针,翻转9个数  2 2 表示:90度,逆时针,翻转4个数  2 3 表示:90度,逆时针,翻转9个数 

输入描述:

输入有多组数据。
每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

输出描述:

输出翻转后的数组。
示例1

输入

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1 3 1 1

输出

11 6 1 4 5
12 7 2 9 10
13 8 3 14 15
16 17 18 19 20
21 22 23 24 25

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;

/**
顺时针 flag = true
  1.把变动矩阵保存在临时矩阵中
  2.临时矩阵求对称矩阵
  3.对称矩阵行首行末相交换
逆时针顺时针变三次 flag = false
*/
int a[10][10];
int temp[10][10];

void fun(int k,bool flag,int x,int y){
    int m = flag ? 1 : 3;
    int bx = x - 1;
    int by = y - 1;
    //赋值
    for(int i = 0; i < k; ++i){
        for(int j = 0; j < k; ++j){
            temp[i][j] = a[bx + i][by + j];
        }
    }
    while(m--){
        for(int i = 0; i < k; ++i){
            for(int j = 0; j < i; ++j){
                int t = temp[i][j];
                temp[i][j] = temp[j][i];
                temp[j][i] = t;
            }
        }
       
        for(int i = 0; i < k; ++i){
            int t = temp[i][0];
            temp[i][0] = temp[i][k-1];
            temp[i][k-1] = t;
        }
    }
    //写回数组
    for(int i = 0; i < k; ++i){
        for(int j = 0; j < k; ++j){
            a[bx + i][by + j] = temp[i][j];
        }
    }
}


int main(void){
    int f1,f2,x,y;
    while(scanf("%d %d %d %d %d",&a[0][0],&a[0][1],&a[0][2],&a[0][3],&a[0][4]) != EOF){
        for(int i = 1; i < 5; ++i){
            for(int j = 0; j < 5; ++j){
                scanf("%d",&a[i][j]);
            }
        }

        scanf("%d %d %d %d",&f1,&f2,&x,&y);

        if(f1 == 1 && f2 == 2){
            fun(2,true,x,y);
        }else if(f1 == 1 && f2 == 3){
            fun(3,true,x,y);
        }else if(f1 == 2 && f2 == 2){
            fun(2,false,x,y);
        }else{
            fun(3,false,x,y);
        }

        for(int i = 0; i < 5; ++i){
            for(int j = 0; j < 5; ++j){
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

矩阵旋转90度 = 求对称矩阵,再每一行中心对称