题目
牛客网-BUPT2010第三题
首先输入一个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:纯列举,硬算
这是个体力活,根据每个元素前后的变化列举,一个个的算就好了,代码太丑了
#include<iostream>
using namespace std;
//90°,顺时针,翻转4个数
void operation1(int a[5][5],int op[4])
{
int x=op[2]-1;
int y=op[3]-1;
int temp=a[x][y];
a[x][y]=a[x+1][y];
a[x+1][y]=a[x+1][y+1];
a[x+1][y+1]=a[x][y+1];
a[x][y+1]=temp;
}
//90°,顺时针,翻转9个数
void operation2(int a[5][5],int op[4])
{
int x=op[2]-1;
int y=op[3]-1;
int temp=a[x][y];
a[x][y]=a[x+2][y];
a[x+2][y]=a[x+2][y+2];
a[x+2][y+2]=a[x][y+2];
a[x][y+2]=temp;
temp=a[x][y+1];
a[x][y+1]=a[x+1][y];
a[x+1][y]=a[x+2][y+1];
a[x+2][y+1]=a[x+1][y+2];
a[x+1][y+2]=temp;
}
//90°,逆时针,翻转4个数
void operation3(int a[5][5],int op[4])
{
int x=op[2]-1;
int y=op[3]-1;
int temp=a[x][y];
a[x][y]=a[x][y+1];
a[x][y+1]=a[x+1][y+1];
a[x+1][y+1]=a[x+1][y];
a[x+1][y]=temp;
}
//90°,逆时针,翻转9个数
void operation4(int a[5][5],int op[4])
{
int x=op[2]-1;
int y=op[3]-1;
int temp=a[x][y];
a[x][y]=a[x][y+2];
a[x][y+2]=a[x+2][y+2];
a[x+2][y+2]=a[x+2][y];
a[x+2][y]=temp;
temp=a[x][y+1];
a[x][y+1]=a[x+1][y+2];
a[x+1][y+2]=a[x+2][y+1];
a[x+2][y+1]=a[x+1][y];
a[x+1][y]=temp;
}
int main()
{
/*输入*/
int a[5][5];
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>a[i][j];
}
}
int op[4];
for(int i=0;i<4;i++)
cin>>op[i];
/*根据命令操作*/
if(op[0]==1&&op[1]==2)
operation1(a,op);
else if(op[0]==1&&op[1]==3)
operation2(a,op);
else if(op[0]==2&&op[1]==2)
operation3(a,op);
else if(op[0]==2&&op[1]==3)
operation4(a,op);
/*输出*/
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
法2:规律
在法1的基础上进一步找各种变换的规律
用到了辅助数组b[5][5],把转换的结果放入b数组
#include<iostream>
using namespace std;
int b[5][5];//辅助数组
void operation(int a[5][5],int *op)
{
int x=op[2]-1;
int y=op[3]-1;
//顺时针
if(op[0]==1)
{
for(int i=x;i<x+op[1];i++)
{
for(int j=y;j<y+op[1];j++)
b[i][j]=a[x+op[1]-j+y-1][y+i-x];
}
}
//逆时针
if(op[0]==2)
{
for(int i=x;i<x+op[1];i++)
{
for(int j=y;j<y+op[1];j++)
b[i][j]=a[x+j-y][y+op[1]-i+x-1];
}
}
}
int main()
{
/*输入*/
int a[5][5];
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
int op[4];
for(int i=0;i<4;i++)
cin>>op[i];
/*根据命令操作,输出*/
operation(a,op);
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}