这题神坑,我已遍体鳞伤,不想多解释。
输入描述:
输入有多组数据。 每组输入一个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 <bits/stdc++.h>
using namespace std;
void f(int a[][5],int x,int y,int len,int flag)
{
int i,j,t[5][5],u,v;
if(flag==0)//顺时针
{
for(i=y,u=0;i<=y+len-1;i++,u++)
for(j=x+len-1,v=0;j>=x;j--,v++)
t[u][v]=a[j][i];
for(i=x,u=0;i<=x+len-1;i++,u++)
for(j=y,v=0;j<=y+len-1;j++,v++)
a[i][j]=t[u][v];
}
else//逆时针
{
for(i=y+len-1,u=0;i>=y;i--,u++)
for(j=x,v=0;j<=x+len-1;j++,v++)
t[u][v]=a[j][i];
for(i=x,u=0;i<=x+len-1;i++,u++)
for(j=y,v=0;j<=y+len-1;j++,v++)
a[i][j]=t[u][v];
}
}
int main()
{
int i,j,n,a[5][5],b[4];
while(scanf("%d%d%d%d%d",&a[0][0],&a[0][1],&a[0][2],&a[0][3],&a[0][4])!=EOF)
{
for(i=1;i<5;i++)
for(j=0;j<5;j++)
cin>>a[i][j];
for(i=0;i<4;i++)
cin>>b[i];
if(b[0]==1&&b[1]==2)
f(a,b[2]-1,b[3]-1,2,0);
if(b[0]==1&&b[1]==3)
f(a,b[2]-1,b[3]-1,3,0);
if(b[0]==2&&b[1]==2)
f(a,b[2]-1,b[3]-1,2,1);
if(b[0]==2&&b[1]==3)
f(a,b[2]-1,b[3]-1,3,1);
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
cout<<a[i][j]<<" ";
cout<<a[i][4]<<endl;
}
}
}