首页 > 其他分享 >洛谷题单指南-模拟和高精度-P4924 [1007] 魔法少女小Scarlet

洛谷题单指南-模拟和高精度-P4924 [1007] 魔法少女小Scarlet

时间:2024-01-18 17:15:10浏览次数:33  
标签:顺时针 int 洛谷题 carlet len 旋转 行号 P4924 90

原题链接:https://www.luogu.com.cn/problem/P4924

题意解读:

根据题意,通过模拟法,枚举每一个要旋转的矩阵,执行旋转操作即可,关键点在于如何进行矩阵旋转。

设定矩阵int a[][], 临时矩阵int t[][]用于保存旋转后的矩阵,矩阵长度为len。

先考虑要旋转的区域左上角是a[0][0]的情况,区域内每个元素下标值是i,j,i∈[0, len-1],j∈[0, len-1]。

1、顺时针旋转90度:

先以行的角度看坐标如何变换:

可以看出,行号经过顺时针旋转90度后,变成了反向的列号。

再以列的角度看坐标如何变换:

可以看出,列号经过顺时针旋转90度后,变成了行号。

因此,对int a[i][j]执行顺时针旋转的操作,保存到int t[][]中,为

t[j][len - i - 1] = a[i][j]行号i变成了反向的列号len - i - 1,列号j变成了行号)

如果旋转的区域左上角不是a[0][0],而是a[x][y],变换时行+x,列+y即可,为

t[x + j][y + len - i - 1] = a[x + i][y + j]

2、逆时针旋转90度:

先以行的角度看坐标如何变换:

可以看出,行号经过顺时针旋转90度后,变成了列号。

再以列的角度看坐标如何变换:

可以看出,列号经过顺时针旋转90度后,变成了反向的行号。

因此,对int a[i][j]执行逆时针旋转的操作,保存到int t[][]中,为

t[len - j - 1][i] = a[i][j]行号i变成了列号,列号j变成了反向的行号len - j - 1)

如果旋转的区域左上角不是a[0][0],而是a[x][y],变换时行+x,列+y即可,为

t[x + len - j - 1][y + i] = a[x + i][y + j]

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 505;

int a[N][N], t[N][N];
int n, m;

//将左上角是x,y,边长len的矩形旋转90度,z=0顺时针,z=1逆时针
void rotate(int x, int y, int len, int z)
{
    for(int i = 0; i < len; i++)
        for(int j = 0; j < len; j++)
            if(z == 0) t[x + j][y + len - i - 1] = a[x + i][y + j];  
            else t[x + len - j - 1][y + i] = a[x + i][y + j];
            
    for(int i = 0; i < len; i++)
        for(int j = 0; j < len; j++)    
            a[x + i][y + j] = t[x + i][y + j];
}

int main()
{
    cin >> n >> m;

    //初始化
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++) 
            a[i][j] = (i - 1) * n + j;

    int x, y, r, z;
    //执行魔法
    for(int i = 1; i <= m; i++)
    {
        cin >> x >> y >> r >> z;
        int dx = x - r; //待旋转的矩形区域左上角x坐标
        int dy = y - r; //待旋转的矩形区域左上角y坐标
        int l = 2 * r + 1; //待旋转的矩形区域边长
        rotate(dx, dy, l, z); //旋转90度
    }        
    //输出结果
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++) cout << a[i][j] << " ";
        cout << endl;
    }

    return 0;
}

 

标签:顺时针,int,洛谷题,carlet,len,旋转,行号,P4924,90
From: https://www.cnblogs.com/jcwy/p/17972908

相关文章

  • 洛谷题单指南-模拟和高精度-P1601 A+B Problem
    原题链接:https://www.luogu.com.cn/problem/P1601题意解读:本题是高精度加法的模版题。知识点解析:  高精度加法:  如果一个数大到远超过整形变量的范围时,就不能使用int、long、longlong等变量来存储整数,也不能直接通过变量加法来求和。  因此,需要回到加法计算的本质,从个......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 洛谷题单指南-模拟和高精度-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • 关于洛谷题解审核
    我想问一下,大家觉得题解的重点是什么?很显然是思路,代码的正确性,次要的才是格式。但是,洛谷对于题解格式的审核是不是有点过于严格了呢?比如说这段话:如果\(n\)为\(0\),那么便是无解。大家能一眼看出,后面多了空格吗?这种题解其实没什么大问题,别人看题解时根本不会在意这些......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • P5836 [USACO19DEC] Milk Visits S - 洛谷题解
     题目链接:[P5836] USACO19DEC] MilkVisitsS-洛谷|计算机科学教育新生态(luogu.com.cn)这道题可以用并查集来解决。题目中每个结点只有两个状态:H和G。那么我们可以推断出,只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)与所需状态不同......
  • 洛谷题解 | P1046 陶陶摘苹果
    ​目录题目描述输入格式输出格式输入输出样例说明/提示题目思路AC代码题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现......
  • 洛谷题解——【模板】堆
    题目链接:【模板】堆【模板】堆题目描述给定一个数列,初始为空,请支持下面三种操作:给定一个整数\(x\),请将\(x\)加入到数列中。输出数列中最小的数。删除数列中最小的数(如果有多个数最小,只删除\(1\)个)。输入格式第一行是一个整数,表示操作的次数\(n\)。接下来\(n\)......
  • 算法刷题记录:P4924 [1007]魔法少女小Scarlet
    题目链接https://www.luogu.com.cn/problem/P4924题目分析题意为将以[x,y]为中心某个矩阵,逆时针/顺时针旋转。所以其本质就是矩阵的旋转,所以找出通项公式即可。通项公式:顺时针:x后=x+y-y原,y后=y-x+x原逆时针:x后=x-y+y原,y后=x+y-x原AC代码//Problem:P4924[1007]魔法少......