首页 > 其他分享 >刷题活动(旋转和翻转)

刷题活动(旋转和翻转)

时间:2024-09-12 21:50:58浏览次数:3  
标签:int 矩阵 旋转 ++ vector 刷题 翻转

        前两天打了CCPC网络赛(让打老实了),现在认识到了刷题的重要性,于是我开创了这么个栏目,我们一起刷一下题。

        还是在ACwing网站上刷题 旋转和翻转 

        首先,申一下题目,输入一个数字 n ,来表示矩阵的行和列,之后输入两个矩阵,判断一下两个矩阵相互能否通过旋转和翻转来相互转换。如果能,输出Yes,否则输出No。

        如果没有见过翻转和旋转的题目,可能会发懵,面对一个矩阵,它可能进行多次运动得到另一个矩阵,我们不能通过运动的层次去分析这道题,这样分析有无限种可能,我们要从状态来分析,比如一个矩阵  

         它通过旋转可以得到四种状态,通过翻转加旋转又可以得到四种状态,所以总共就是八种状态,(这里我插进来图片不太好看,大家可以自己手写一下,写一下就很容易就明白了),在题中,如果我们可以一一找出输入的第一个矩阵的八种状态,并对于第二个矩阵做对比,如果有和第二个矩阵相同的,就输出Yes,否则输出No。

        代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

int n;
vector<string> a,b;

vector<string> flip(vector<string> a){
    for(int i = 0; i < n ; i ++ ){
        for(int j = 0, k = n - 1; j < k ; j ++, k --){
            swap(a[i][j],a[i][k]);
        }
    }
    return a;
}

vector<string> rotate(vector<string> a){
    a = flip(a);
    for(int i = 0; i < n ;i ++ ){
        for(int j = 0; j < i ; j ++ ){
            swap(a[i][j], a[j][i]);
        }
    }
    return a;
}

bool check(){
    for(int i = 0; i < 4 ; i ++ ){
        a = rotate(a);
        if(a == b) return true;
    }
    a = flip(a);
    for(int i = 0; i < 4 ; i ++ ){
        a = rotate(a);
        if(a == b) return true;
    }
    return false;
}

int main(){
    cin >> n;
    a = b = vector<string>(n);
    for(int i = 0; i < n ; i ++ ) cin >> a[i];
    for(int i = 0; i < n ; i ++ ) cin >> b[i];
    if(check()) cout << "Yes" <<endl;
    else cout << "No" << endl;
    return 0;
}

        在这个代码中,最重要的就是翻转 flip 和旋转 rotate 这两个操作,flip 理解起来比较简单,就是左右的字符对换了一下位置,比如abcd1234efgh这个矩阵,就变成了下面这样,以中间为对称轴,来对换。

        至于旋转,我们是先进行左右翻转操作,再进行以对角线为对称轴进行翻转,以达到旋转90度的目的,再举一个例子

        实在不行的话,可以随便找一本书来手动翻转试一下,很有意思的现象。

        另外还要注意,这里我们是用vector字符数组来存储的,希望大家习惯用这种方式,好处在于,可以比较方便地进行输入,以及支持二位数组,支持swap交换函数。

        好,下课

标签:int,矩阵,旋转,++,vector,刷题,翻转
From: https://blog.csdn.net/m0_74431639/article/details/142186031

相关文章

  • LeetCode刷题
    2.11378.使用唯一标识码替换员工ID2.1.1说明Employees表:±--------------±--------+|ColumnName|Type|±--------------±--------+|id|int||name|varchar|±--------------±--------+在SQL中,id是这张表的主键。这张表的每一行分别代表了某......
  • leetcode刷题
    3.1力扣之1421-净现值查询3.1.1说明表:NPV±--------------±--------+|ColumnName|Type|±--------------±--------+|id|int||year|int||npv|int|±--------------±--------+(id,year)是该表主键(具有唯一值的列的组合).该表有每一笔存......
  • 2.10 某容器内侧是由曲线x^2+y^2=4y(1<=y<=3)与x^2+y^2=4(y<=1)绕y轴旋转一周而形成的曲
    点击查看代码fromscipy.integrateimportquadimportnumpyasnp#第一部分:抛物线旋转体(修正后)defV1_quad(y):returnnp.pi*(4*y-y**2)V1_corrected,_=quad(V1_quad,1,3)#第二部分保持不变V2=0.5*(4/3)*np.pi*2**3-(1......
  • 通过方向计算四元数旋转
    1//已知方向,求物体的旋转2publicstaticQuaternionGetRotation(Vector3knownDirection)3{4knownDirection.Normalize();5//Unity中的世界坐标系中,正前方通常为Vector3.forward(0,0,1)6Ve......
  • 【每日刷题】Day119
    【每日刷题】Day119......
  • python+opencv图片文字旋转矫正
    最近在使用实在RPA做机器人自动化,功能是受理单核对,即对核对业务受理人是否上传受理单承诺书方法很简单,由于系统中图片位置不固定,所以需要将所有附件进行下载,并进行图像文字识别,但是实在RPA中的OCR识别无法识别颠倒倾斜的图片,所以有两种方法,一种是使用其他OCR模型,一种是将图片旋转......
  • 9/12力扣刷题笔记
     动态规划法,时间和空间复杂度均为O(n)此方法超出时间限制。 用滚动数组思想,把空间复杂度优化成O(1) 70.爬楼梯-力扣(LeetCode)官方题解的方法2,3没看。 classSolution{public:stringaddBinary(stringa,stringb){intlen_a=a.length();......
  • LeetCode Hot100刷题记录-142. 环形链表 II
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是......
  • C++竞赛初阶L1-15-第六单元-多维数组(34~35课)557: T456507 图像旋转
    题目内容输入一个 n 行 m 列的黑白图像,将它顺时针旋转 90 度后输出。输入格式第一行包含两个整数 n 和 m,表示图像包含像素点的行数和列数。1≤n≤100,1≤m≤100。接下来 n 行,每行 m 个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素......
  • Android 10.0 mtk平板camera2横屏预览旋转90度横屏保存录像旋转90度功能实现
    1.前言在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,点击录像保存的视频依然是竖屏的,所以说同样需要将视频也保存为横屏视频了,所以就需......