C翻转-详细解答

C翻转

http://www.nowcoder.com/questionTerminal/74bdb725421c4f80b4aca7266818baf0

  • 思路

    • 比较明显的坐标变换问题,可以把问题转换为若干个点绕某一个定点进行顺时针或者逆时针旋转,求其旋转后的坐标
    • 比如样例中,以(1,1)为左上角,顺时针旋转3X3方阵,求旋转之后的矩阵。事实上,只需要对这个局部3X3方阵中的所有点进行旋转即可,其他位置的数不必动。旋转中心根据左上角坐标以及旋转半径很容易求出来,然后套公式计算旋转之后的位置坐标即可。
  • 核心数学公式

    • 任意点(x,y),绕一个坐标点(rx,ry)逆时针旋转a角度后的新的坐标设为(x0, y0),有公式:

    • 注意这里a角度是逆时针,顺时针旋转时角度取负即可。因为是90度所以三角函数值无非就是1,0,自己代入手动计算一下。证明的话在纸上画一下坐标系,根据三角函数关系不难推算。

  • 代码

#include<iostream>
#include<queue>
#include<list>
#include<vector>
#include<cstring>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#include<algorithm>
#include<string>
#include<stdio.h>
using namespace std;
typedef long long ll;


int main(){
    int num[10][10];
    int bak[10][10];
    int a,b,x,y;
    while(cin>>num[1][1]){ //多组样例输入

        for(int i=2;i<6;i++) cin>>num[1][i];
        for(int i=2; i<6; i++){
            for(int j=1; j<6; j++){
                cin>>num[i][j];
            }
        }
        //接收左上角坐标以及旋转方式 旋转块大小
        cin>>a>>b>>x>>y;

        for(int i=1; i<6; i++){
            for(int j=1; j<6; j++){
                if(i>=x && i<x+b && j>=y && j<y+b){ //若该点在旋转方阵区域内
                    if(a == 2){ //逆时针旋转
                        int x0 = x + y - j + b - 1;
                        int y0 = i - x + y;
                        bak[x0][y0] = num[i][j]; //
                    }
                    else{ //顺时针旋转
                        int x0 = j - y + x;
                        int y0 = x + y + b - i - 1;
                        bak[x0][y0] = num[i][j];
                    }
                }
                else{ //外部点不动
                    bak[i][j] = num[i][j];
                }
            }

        }

        for(int i=1; i<6; i++){
            for(int j=1; j<6; j++){
               if(j != 1) cout<<" ";
                   cout<<bak[i][j];
                }
            cout<<endl;
        }
    }
    return 0;
}

全部评论

相关推荐

头像
10-27 20:19
已编辑
门头沟学院 人工智能
本文略长,献给身处双非、学院本科的低年级依旧陷入迷茫的同学,一个参考。夹杂强烈主观因素,若观点不同,仅当笑料。近日,工作之余的午休时间给母校的学弟学妹进行了宣讲,同时也接受了牛客的访谈,不约而同的触发了两个关键词考研,就业。现象今年和去年,认识的学弟学妹,来自知某、抖某、牛客等系列的学弟学妹,这次宣讲,约有20个学弟学妹来加了我的联系方式,向我取经,聊聊未来,聊聊想法。我这里简单概括一下。1.现在很迷茫,大方向摇摆就业还是考研,但是倾向考研。小方向摇摆竞赛和项目,不知道怎么去做,不知道怎么开始。2.考研的直接目的绝大多数都是为了(混)学历,根本目的就是提高就业竞争力。3.我把他们都拉了个群,在...
牛客85294058...:“私聊能够滔滔不绝,而拉了一个小群之后就完全一声不吭”个人观点这跟从小到大“不要浪费大家时间”的社会环境有关:个人化的提问,如果你上学时有留心、或者参加QA环节多,会注意到这种做法经常是被人骂的。要营造让大家开口的氛围和做出欢迎讨论的议题设置还是比较难的,期待方法探索。
投递大连飞创信息技术有限公司等公司10个岗位
点赞 评论 收藏
分享
迷茫的大四🐶:都收获五个了,兄弟那还说啥,不用改了,去玩吧
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务