题目描述
首先输入一个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;
}