【机试备考】Day29-旋转图像 | 数组

题目

BUPT 2014 计算机 ProblemB(oj)
在图形学中,我们经常需要对具体的图像进行一-些处理。在这个问题中,你的任务是将一幅只包含01像素点的图片进行顺时针旋转。旋转的角度仅包含0度,90度,180度和270度。

用时:45min

输入描述

输入的第行是一个整数T (T≤50),表示输入的数据组数。
每组测试数据的第一.行是两个整数N和M(1≤N,M≤50),表示图片的高度和宽度。
接下来N行,每行是一个长度为M的01串,表示图片的像素点。最后一行是一个整数angle,表示旋转的角度。

输出描述

对于每组测试数据,输出旋转后得到的图片。请注意不要输出多余的空格或空行。

示例

输入

2
2 3
111
000
90
3 3
111
101
111
180

输出

01
01
01
111
101
111

题解

#include <bits/stdc++.h>
#define M 100005
using namespace std;
int main()
{
    int t;
    cin>>t;
    for(int i=1; i<=t; i++)
    {
        int m,n,angle;
        cin>>n>>m;
        int a[55][55],b[55][55];
        string row;
        for(int j=0; j<n; j++)
        {
            cin>>row;
            for(int k=0; k<m; k++)
                a[j][k]=row[k]-'0';
        }
        cin>>angle;
        if(angle==0)
        {
            for(int j=0; j<n; j++)
            {
                for(int k=0; k<m; k++)
                    b[j][k]=a[j][k];
            }
        }
        else if(angle==90)
        {
            for(int j=0; j<n; j++)
            {
                for(int k=0; k<m; k++)
                {
                    b[k][n-1-j]=a[j][k];
                }
            }
            swap(n,m);
        }
        else if(angle==180)
        {
            for(int j=0; j<n; j++)
            {
                for(int k=0; k<m; k++)
                {
                    b[n-1-j][m-1-k]=a[j][k];
                }
            }
        }
        else
        {
            for(int j=0; j<n; j++)
            {
                for(int k=0; k<m; k++)
                {
                    b[m-1-k][j]=a[j][k];
                }
            }
            swap(n,m);
        }
        for(int j=0; j<n; j++)
        {
            for(int k=0; k<m; k++)
            {
                cout<<b[j][k];
            }
            cout<<endl;
        }
    }
}

改进

更好的办法是:写一个旋转90度的函数,根据总共旋转的度数每次调用函数。比如:旋转270度就调用三次旋转90度的函数

#include <bits/stdc++.h>
#define M 100005
using namespace std;
//旋转90
void rot(int n,int m,int angle,int a[55][55])
{
    if(angle==0)
    {
        for(int j=0; j<n; j++)
        {
            for(int k=0; k<m; k++)
            {
                cout<<a[j][k];
            }
            cout<<endl;
        }
        return;
    }
    int b[55][55];
    for(int j=0; j<n; j++)
    {
        for(int k=0; k<m; k++)
        {
            b[k][n-1-j]=a[j][k];
        }
    }
    rot(m,n,angle-90,b);
}
int main()
{
    int t;
    cin>>t;
    for(int i=1; i<=t; i++)
    {
        int m,n,angle;
        cin>>n>>m;
        int a[55][55],b[55][55];
        string row;
        for(int j=0; j<n; j++)
        {
            cin>>row;
            for(int k=0; k<m; k++)
                a[j][k]=row[k]-'0';
        }
        cin>>angle;
        rot(n,m,angle,a);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值