【机试备考】Day6-C翻转

题目

牛客网-BUPT2010第三题
首先输入一个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:纯列举,硬算

这是个体力活,根据每个元素前后的变化列举,一个个的算就好了,代码太丑了

#include<iostream>
using namespace std;
//90°,顺时针,翻转4个数
void operation1(int a[5][5],int op[4])
{
    int x=op[2]-1;
    int y=op[3]-1;
    int temp=a[x][y];
    a[x][y]=a[x+1][y];
    a[x+1][y]=a[x+1][y+1];
    a[x+1][y+1]=a[x][y+1];
    a[x][y+1]=temp;
}
//90°,顺时针,翻转9个数
void operation2(int a[5][5],int op[4])
{
    int x=op[2]-1;
    int y=op[3]-1;
    int temp=a[x][y];
    a[x][y]=a[x+2][y];
    a[x+2][y]=a[x+2][y+2];
    a[x+2][y+2]=a[x][y+2];
    a[x][y+2]=temp;
    temp=a[x][y+1];
    a[x][y+1]=a[x+1][y];
    a[x+1][y]=a[x+2][y+1];
    a[x+2][y+1]=a[x+1][y+2];
    a[x+1][y+2]=temp;
}
//90°,逆时针,翻转4个数
void operation3(int a[5][5],int op[4])
{
    int x=op[2]-1;
    int y=op[3]-1;
    int temp=a[x][y];
    a[x][y]=a[x][y+1];
    a[x][y+1]=a[x+1][y+1];
    a[x+1][y+1]=a[x+1][y];
    a[x+1][y]=temp;
}
//90°,逆时针,翻转9个数
void operation4(int a[5][5],int op[4])
{
    int x=op[2]-1;
    int y=op[3]-1;
    int temp=a[x][y];
    a[x][y]=a[x][y+2];
    a[x][y+2]=a[x+2][y+2];
    a[x+2][y+2]=a[x+2][y];
    a[x+2][y]=temp;
    temp=a[x][y+1];
    a[x][y+1]=a[x+1][y+2];
    a[x+1][y+2]=a[x+2][y+1];
    a[x+2][y+1]=a[x+1][y];
    a[x+1][y]=temp;
}

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 op[4];
    for(int i=0;i<4;i++)
        cin>>op[i];
    /*根据命令操作*/
    if(op[0]==1&&op[1]==2)
        operation1(a,op);
    else if(op[0]==1&&op[1]==3)
        operation2(a,op);
    else if(op[0]==2&&op[1]==2)
        operation3(a,op);
    else if(op[0]==2&&op[1]==3)
        operation4(a,op);
    /*输出*/
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
}

 

法2:规律

在法1的基础上进一步找各种变换的规律

用到了辅助数组b[5][5],把转换的结果放入b数组

#include<iostream>
using namespace std;
int b[5][5];//辅助数组
void operation(int a[5][5],int *op)
{
    int x=op[2]-1;
    int y=op[3]-1;
    //顺时针
    if(op[0]==1)
    {
        for(int i=x;i<x+op[1];i++)
        {
            for(int j=y;j<y+op[1];j++)
                b[i][j]=a[x+op[1]-j+y-1][y+i-x];
        }
    }
    //逆时针
    if(op[0]==2)
    {
        for(int i=x;i<x+op[1];i++)
        {
            for(int j=y;j<y+op[1];j++)
                b[i][j]=a[x+j-y][y+op[1]-i+x-1];
        }
    }
}
int main()
{
    /*输入*/
    int a[5][5];
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            cin>>a[i][j];
            b[i][j]=a[i][j];
        }
    }
    int op[4];
    for(int i=0;i<4;i++)
        cin>>op[i];
    /*根据命令操作,输出*/
    operation(a,op);
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
            cout<<b[i][j]<<" ";
        cout<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值