题目描述
首先输入一个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
先把要翻转的部分提出来反转后复制到数组b,然后再复制到数组a的相应位置
由于我比较笨,只能暴力解决。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[6][6];
int b[4][4];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int x;
for(int i = 1;i < 6;i++)
{
for(int j = 1;j < 6;j++)
{
scanf("%d",&x);
a[i][j] = x;
}
}
int p,q,m,n;
scanf("%d%d%d%d",&p,&q,&m,&n);
if(p == 1)//顺时针翻转
{
int e = 1,f = 1;
for(int i = n,e = 1;i < n + q;i++,e++)//把要翻转的部分翻转后,复制到数组b
{
for(int j = m + q - 1,f = 1;j >= m;j--,f++)
{
b[e][f] = a[j][i];
}
}
for(int i = m,e = 1;i < m + q;i++,e++)//将数组b上的内容对应复制到数组a上
[html] view plain copy
{
for(int j = n,f = 1;j < n + q;j++,f++)
{
a[i][j] = b[e][f];
}
}
}
else if(p == 2)//逆时针翻转
{
int e = 1,f = 1;
for(int i = n + q - 1,e = 1;i >= n;i--,e++)
{
for(int j = m,f = 1;j < m + q;j++,f++)
{
b[e][f] = a[j][i];
}
}
for(int i = m,e = 1;i < m + q;i++,e++)
{
for(int j = n,f = 1;j < n + q;j++,f++)
{
a[i][j] = b[e][f];
}
}
}
for(int i = 1;i < 6;i++)
{
for(int j = 1;j < 6;j++)
{
if(j != 5)
printf("%d ",a[i][j]);
else
printf("%d\n",a[i][j]);
}
}