题目描述
将一幅只包含01像素点的图片进行顺时针旋转。旋转角度仅包含0度,90度,180度和270度。
输入格式
输入的第一行是一个整数T(T <= 50),表示输入的组数。
每组测试数据的第一行是两个整数N和M,(1 <= N,M <= 50),表示图片的高度和宽度。
接下来的N行,每行是一个长度为M的01串,表示图片的像素点。
最后一行是一个整数angle,表示旋转的角度。
输出格式
对于每组测试数据,输出旋转后得到的图片。请注意不要输出多余的空格或空行。
输入样例
2
2 3
111
000
90
3 3
111
101
111
108
输出样例
01
01
01
111
101
111
题目分析
阅读题目发现这是一个找规律的题目,找出0°、90°、180°、270°的规律
比如:
123
456
789
旋转0°:
123
456
789
不变,直接输出
旋转90°:
741
852
963
观察二维数组坐标变化:
3(0,2)->(2,2)
2(0,1)->(1,2)
6(1,2)->(2,1)
观察行的变化:
第0行->第2列
第2行->第2列
第3行->第0列
旧行号i与新的列号j的和为n-1
观察列的变化:
第0列->第0行
第1列->第1行
第2列->第2行
旧的列号i与新的行号j一致
旋转180°:
987
654
321
观察行的变化:
第0行->第2行
第1行->第1行
第2行->第0行
旧的行号i与新的行号i和为n-1
观察列的变化:
第0列->第2列
第1列->第1列
第2列->第0列
旧的列号j与新的列号j和为n-1
旋转270°:
369
258
147
观察行的变化:
第0行->第0列
第1行->第1列
第2行->第2列
旧的行号i与新的列号j一致
观察列的变化:
第0列->第2行
第1列->第1行
第2列->第0行
旧的列号j与新的行号i和为n-1
接下来只需要将规律转为代码。
代码
//找规律的问题,找出旋转90°,180°,270°时的行列变换规律
#include <iostream>
#include <string.h>
using namespace std;
int main(){
int T, N, M, angle;
int before[100][100];
int after[100][100];
char a[100];
cin >> T;
while(T--){
memset(before, 0, sizeof(before));
memset(after, 0, sizeof(after));
cin >> N >> M;
for(int i = 0; i < N; i++){
cin >> a;
for(int j = 0; j < M; j++){
before[i][j] = a[j] - '0';//字符型转为整型,存的是ASCII码 '1'-'0'=1
}
}
cin >> angle;
if(angle == 0){
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
after[i][j] = before[i][j];
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
cout << after[i][j];
}
cout << endl;
}
}
if(angle == 90){
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
after[j][N-1-i] = before[i][j];
}
}
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
cout << after[i][j];
}
cout << endl;
}
}
if(angle == 180){
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
after[N-1-i][M-1-j] = before[i][j];
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
cout << after[i][j];
}
cout << endl;
}
}
if(angle == 270){
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
after[M-1-j][i] = before[i][j];
}
}
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
cout << after[i][j];
}
cout << endl;
}
}
}
return 0;
}
总结
1、每组测试数据输入前要初始化数组
2、题目中给出的是01串,在处理时要将数组中存储的字符型转为整型,直接用a[j]-'0’就可得到。因为字符型存储的是字符的ASCII码。