[小白算法入门] A.坐标变换 算法题解

StarryCoding入门教育赛 3
比赛链接:https://www.starrycoding.com/contest/8

题目描述

武汉市可以看做一个二维地图。

eee掌握了一项特异功能,他可以“瞬移”,每次瞬移需要分别设定xxxyyy的偏移量dxdxdxdydydy,瞬移完成后位置会从(x,y)(x, y)(x,y)变为(x+dx,y+dy)(x + dx, y + dy)(x+dx,y+dy)

现在已知牢eee初始在(0,0)(0, 0)(0,0),并且进行了nnn次瞬移,给出每次瞬移的dxdxdxdydydy,请问牢eee最终位置在哪里?

输入格式

第一行一个整数T(1≤T≤100)T(1 \le T \le 100)T(1T100)表示样例个数。

对于每一个样例:

第一行111个整数n(1≤n≤105)n(1 \le n \le 10^5)n(1n105)

接下来nnn行,每行描述一次“瞬移”,两个整数表示dx,dy(−103≤dx,dy≤103)dx, dy(-10^3 \le dx, dy \le 10^3)dx,dy(103dx,dy103)

数据保证1≤∑n≤2×1051 \le \sum n \le 2 \times 10^51n2×105

输出格式

对于每组测试样例,两个整数x,yx, yx,y表示牢eee最终位置(x,y)(x, y)(x,y)

输入样例1

7
1
10 8
3
6 -9
1 3
-3 0
4
-1 -5
9 3
-7 8
-10 8
3
-2 -10
-6 2
-8 6
2
-10 2
-4 9
1
-4 -1
2
6 -9
4 4

输出样例1

10 8
4 -6
-9 14
-16 -2
-14 11
-4 -1
10 -5

题解

这是一道很简单的语法题,考察输入输出、循环结构和数学运算。

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

const ll p = 998244353;
const int N = 2e5 + 9;

void solve()
{
    int n;
    cin >> n;
    ll x = 0, y = 0;
    for (int i = 1; i <= n; ++i)
    {
        ll dx, dy;
        cin >> dx >> dy;
        x += dx, y += dy;
    }
    cout << x << ' ' << y << '\n';
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

StarryCoding是面向计算机专业学生的综合学习与刷题平台,平均每2-3天举办一场面向算法小白的入门教育赛,非常适合零基础的同学学习!
bing搜索:StarryCoding
在这里插入图片描述

public class CoordTrans7Param { public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double   两个坐标系转换一般需要平移,旋转,缩放共七参数。 Y=(1+k)*M(x,y,z)*X+dX; public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double dx,dy,dz,rx,ry,rz,k; public void Set4Param(double dx,double dy,double dz,double k) { this.dx=dx; this.dy=dy; this.dz=dz; this.k=k; this.rx=this.ry=this.rz=0; } public void SetRotationParamRad(double rx,double ry,double rz) { this.rx=rx; this.ry=ry; this.rz=rz; } public void SetRotationParamMM(double rx,double ry,double rz) { SetRotationParamRad(rx*Math.PI/648000,ry*Math.PI/648000,rz*Math.PI/648000); } private double[,] GetMx() { double [,] Mx=new double[,] {{1,0,0}, {0,Math.Cos(rx),Math.Sin(rx)}, {0,-Math.Sin(rx),Math.Cos(rx)}}; return Mx; } private double[,] GetMy() { double [,] My=new double[,] {{Math.Cos(ry),0,-Math.Sin(ry)}, {0,1,0}, {Math.Sin(ry),0,Math.Cos(ry)}}; return My; } private double[,] GetMz() { double [,] Mz=new double[,] {{Math.Cos(rz),Math.Sin(rz),0}, {-Math.Sin(rz),Math.Cos(rz),0}, {0,0,1}}; return Mz; } private double[,] GetM() //M=Mx*My*Mz? or M=Mz*My*Mx? { double [,] M=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref M); MatrixTool.Multi(M,GetMx(),ref M); return M; } private double[,] GetMdx() { double[,] mt = {{ 0, 0, 0 }, { 0, -Math.Sin(rx), Math.Cos(rx) }, { 0, -Math.Cos(rx), -Math.Sin(rx) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref m); MatrixTool.Multi(m,mt,ref m); return m; } private double[,] GetMdy() { double[,] mt = {{ -Math.Sin(ry), 0, -Math.Cos(ry) }, { 0, 0, 0 }, { Math.Cos(ry), 0, -Math.Sin(ry) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),mt,ref m); MatrixTool.Multi(m,GetMx(),ref m); return m; } private double[,] GetMdz() { double[,] mt = {{ -Math.Sin(rz), Math.Co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值