题目描述
首先输入一个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为左上角的那几个数据。
输出描述:
输出翻转后的数组。
设置一个一维数组,顺序保存需要反转的数字,然后再按照翻转规则重新放到二维数组中。
代码在本地编译器测试成功了,但是牛客网上依然只能打印出一行,无解。
#include <iostream>
#include <cstdio>using namespace std;int num[5][5];void revers(int op[],int x,int y) //C翻转
{x--;y--; //自减适应下标int dir,dis; //解析指令if(op[0]==1) dir=1;else dir=0;if(op[1]==2) dis=2;else dis=3;int temp[25]; //临时数组int n=0;for(int i=x;i<x+dis;i++){for(int j=y;j<y+dis;j++)temp[n++]=num[i][j];}n=0; //临时数组下标处理if(!dir) //顺时针{for(int i=x+dis-1;i>=x;i--){for(int j=y;j<y+dis;j++)num[i][j]=temp[n++];}}else{for(int j=y+dis-1;j>=y;j--){for(int i=x;i<x+dis;i++)num[i][j]=temp[n++];}}return ;
}int main()
{int m,n;for(m=0;m<5;m++)for(n=0;n<5;n++)scanf("%d",&num[m][n]);int op[2];int x,y;scanf("%d%d%d%d",&op[0],&op[1],&x,&y);revers(op,x,y);for(m=0;m<5;m++){for(n=0;n<5;n++){printf("%d ",num[m][n]);}printf("\r\n");}return 0;
}