考研机试:数学问题之旋转图像

版权声明:本博全为博主学习日常,均为原创,请勿转载 https://blog.csdn.net/weixin_44332298/article/details/87725669

题目描述

将一幅只包含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码

猜你喜欢

转载自blog.csdn.net/weixin_44332298/article/details/87725669
今日推荐