题目描述
首先输入一个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
解题思路
此题主要就是找到旋转时对数组应该作何变动,即找出规律,大家如果没有思路可以在纸上把旋转前和旋转后的数组进行对比,找到规律后就对5*5数组加上一个偏移量x,y进行相应元素个数的变换就阔以了,不算难,直接附上代码了,哪里不懂评论就好了。
#include<iostream>
using namespace std;
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 mode,n,x,y; //mode:代表旋转模式 n:旋转元素个数(n=2代表2*2)
cin>>mode>>n;
cin>>x>>y;
int temp[n][n]; //存储旋转后得到的数组元素
if(mode==1){ //顺时针旋转
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
temp[j][i]=a[x-1+n-1-i][y-1+j];
}
}
}else if(mode==2){ //逆时针旋转
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
temp[n-1-j][i]=a[x-1+i][y-1+j];
}
}
}
for(int i=0;i<n;i++){ //将变换后得到数组元素赋值给原数组
for(int j=0;j<n;j++){
a[i+x-1][j+y-1]=temp[i][j];
}
}
for(int i=0;i<5;i++){ //输出
for(int j=0;j<5;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
总结
对于这种对数组进行旋转等变换的题目,找规律很关键,只要找到了变换后元素位置和当前元素位置的规律,题目基本就解决了。