题目描述
首先输入一个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度 = 求对称矩阵,再每一行中心对称