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;
}

全部评论

相关推荐

头像 会员标识 头像
今天 14:43
已编辑
西安交通大学 数学类
BG&nbsp;双9,因为之前一直考虑想出国想读博士,因此研二一直在被导催着写论文,一直写到五月初,大部分工作都做的差不多了,五一回去跟女朋友一直在玩儿,出于很多原因想直接就业(想赚钱摆烂),临时开始找实习,因为只做过华为的横向(理论),加上完全从五月初才开始刷leetcode,本来本科只浅浅学了一下c++,后来发现python做起来简单多了,开始准备python和leetcode去试一下算法岗(研究方向是优化理论相关的)。5.10&nbsp;过了简历5.15&nbsp;当晚有临时有汇报,让调了一下机试时间5.22&nbsp;机试三道题,一道最大公共子串动态规划,一道图模型用的dijstra解决,第三道不太会就没写了,机试300分5.30&nbsp;下午五点半技术面试,面试官对我导在的实验室有了解,对我刚弄完的论文很有兴趣,但其实非常理论,做的快速算法,主要是理论工作,直接找了之前组会ppt详细讲了一下,面试官感觉很满意,场面非常愉快。最后撕了个算法,leetcode&nbsp;714,也是动态规划,写了状态方程说了一下返回值,面试官直接就让过了。5.30&nbsp;下午六点半主管面,问了一下项目相关,之后主要是问有没有经历什么挫折,如何看待团队合作,有没有从0到1学习一些新知识体系,如何看待华为文化之类的。5.31&nbsp;晚上八点主管面过,问了一下HR,说是端午前后开奖,看看华子怎么说了,能有实习刷简历最好,不行直接回组里先做横向去了。其实从我五月初开始第一次用牛客和leetcode,感觉看牛客真是给自己添加了不少焦虑,焦虑拉满,毕竟非科班加起步晚,都感觉自己不用考虑实习了,后来跟女朋友说到这个事,得到了我的小天使的超级开解,让我觉得人生其实容错率很高,希望焦虑的同学们放宽心一些,觉得懒了就向上看,觉得累了就向下看,大部分时间平视就ok了。6.1&nbsp;有这么多人看吗,感觉大家貌似对找实习流程都不是很感兴趣,关注点不太对哦。看大家对我对象都很感兴趣,也不是不可以再分享一些被爱的小经历。从大二还比较青涩的时光到去年我的外院小女友去兼职雅思教师,我也是从强撑大男子主义到拥抱了吃软饭的新天地。其实本来只是想发个动态截个图打趣一下我对象,也不乏一些小小炫耀的心思。真心希望各位牛友在使自己优秀的同时(看牛客是真的焦虑)也能遇到那个真心爱你的女孩。有熟人看到吱一声,马上删
投递华为等公司10个岗位
点赞 评论 收藏
转发
4 1 评论
分享
牛客网
牛客企业服务