CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)

CCF CSP 第30次(2023.09)(1_坐标变换_C++)

时间限制 : 1.0 秒
空间限制: 512 MiB

题目描述:

对于平面直角坐标系上的坐标 (x,y),小 P 定义了一个包含 n 个操作的序列 T=(t1,t2,⋯,tn)。其中每个操作 ti(1≤i≤n)包含两个参数 dxi 和 dyi,表示将坐标 (x,y) 平移至 (x+dxi,y+dyi) 处。

现给定 m 个初始坐标,试计算对每个坐标 (xj,yj)(1≤j≤m)依次进行 T 中 n 个操作后的最终坐标。

输入格式:

从标准输入读入数据。

输入共 n+m+1 行。

输入的第一行包含空格分隔的两个正整数 n 和 m,分别表示操作和初始坐标个数。

接下来 n 行依次输入 n 个操作,其中第 i(1≤i≤n)行包含空格分隔的两个整数 dxi、dyi。

接下来 m 行依次输入 m 个坐标,其中第 j(1≤j≤m)行包含空格分隔的两个整数 xj、yj。

输出格式:

输出到标准输出中。

输出共 m 行,其中第 j(1≤j≤m)行包含空格分隔的两个整数,表示初始坐标 (xj,yj) 经过 n 个操作后的位置。

样例输入:

cpp 复制代码
3 2
10 10
0 0
10 -20
1 -1
0 0

样例输出:

cpp 复制代码
21 -11
20 -10

样例解释:

第一个坐标 (1,−1) 经过三次操作后变为 (21,−11);第二个坐标 (0,0) 经过三次操作后变为 (20,−10)。

子任务:

全部的测试数据满足:n,m ≤ 100,所有输入数据(x,y,dx,dy)均为整数且绝对值不超过 105

解题思路:

思路一(先输入再计算):

1、解题步骤拆分:

① 第一行输入整数n和m

② 接下来输入n行,dxi,dyi (整数):记录在数组中

③ 接下来输入m行,xi和yi (整数):记录在数组中

④ 将各个x,y进行偏移

思路二(边输入边计算):

1、解题步骤拆分:

① 第一行输入整数n和m

② 接下来输入n行,dxi,dyi (整数):计算总的偏移量

③ 加下来输入m行,xi和yi (整数):边输入边输出

④ 将各个x,y进行偏移

代码实现

代码实现(思路一(先输入再计算)):
cpp 复制代码
#include<iostream>
#include <vector>
using namespace std;

void solution1(){
    int n, m;  // 声明两个整数 n 和 m,n 为偏移量的数量,m 为坐标点的数量
    cin >> n >> m;  // 输入偏移量的数量 n 和坐标点的数量 m

    int dxi[n], dyi[n];  // 声明两个数组,分别用于存储 x 和 y 方向的偏移量

    // 读取 n 行偏移量数据,存储到 dxi 和 dyi 数组中
    for (int i = 0; i < n; i++)  
    {
        cin >> dxi[i] >> dyi[i];  // 输入每个偏移量的 x 和 y
    }

    int x[m], y[m];  // 声明两个数组,分别存储 m 个坐标点的 x 和 y 坐标

    // 读取 m 行坐标数据,存储到 x 和 y 数组中
    for (int j = 0; j < m; j++)  
    {
        cin >> x[j] >> y[j];  // 输入每个坐标点的 x 和 y 坐标
    }

    // 对每一个坐标点,进行偏移计算
    for (int j = 0; j < m; j++)  // 遍历每个坐标点
    {
        for (int i = 0; i < n; i++)  // 遍历每个偏移量
        {
            x[j] += dxi[i];  // 对当前坐标点的 x 坐标进行偏移
            y[j] += dyi[i];  // 对当前坐标点的 y 坐标进行偏移
        }
        cout << x[j] << " " << y[j] << endl;  // 输出更新后的坐标点
    }
}

int main(int argc, char const *argv[]){
    solution1();
    return 0;
}
代码实现(思路一(边输入边计算)):
cpp 复制代码
#include<iostream>
#include <vector>
using namespace std;

void solution2(){
    int n, m;  // 声明两个整数 n 和 m,n 为偏移量的数量,m 为坐标点的数量
    cin >> n >> m;  // 输入偏移量的数量 n 和坐标点的数量 m
    
    int sum_dx = 0, sum_dy = 0;  // 初始化 sum_dx 和 sum_dy 为 0,分别用于累加所有偏移量的 x 和 y 方向的总和
    int dx, dy;  // 声明变量 dx 和 dy 用于存储每次输入的偏移量

    // 读取 n 行偏移量数据,计算所有偏移量的 x 和 y 方向的总和
    for (int i = 0; i < n; i++)  
    {
        cin >> dx >> dy;  // 输入每个偏移量的 x 和 y
        sum_dx += dx;  // 将 x 偏移量加到 sum_dx 中
        sum_dy += dy;  // 将 y 偏移量加到 sum_dy 中
    }

    int x, y;  // 声明变量 x 和 y 用于存储每个坐标点的 x 和 y 坐标
    // 读取 m 行坐标数据,应用总偏移量并输出新的坐标点
    for (int j = 0; j < m; j++)  
    {
        cin >> x >> y;  // 输入每个坐标点的 x 和 y 坐标
        x += sum_dx;  // 将累积的 x 偏移量加到当前坐标点的 x 坐标上
        y += sum_dy;  // 将累积的 y 偏移量加到当前坐标点的 y 坐标上
        cout << x << " " << y << endl;  // 输出更新后的坐标点
    }
}

int main(int argc, char const *argv[]){
    solution2();
    return 0;
}

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
软件算法开发3 分钟前
基于卡尔曼滤波的雷达光电多目标航迹融合算法matlab仿真
算法·matlab·卡尔曼滤波·雷达光电·多目标航迹融合
吐泡泡科技1 小时前
MATLAB风光柴储微网粒子群算法
算法·matlab·粒子群算法·风光柴储微网
不吃元西1 小时前
leetcode top100矩阵题73.54.48.240
算法·leetcode·矩阵
subject625Ruben1 小时前
Matlab多种算法解决未来杯B的多分类问题
人工智能·算法·机器学习·数学建模·matlab·分类·未来杯
Antonio9152 小时前
【设计模式】原型模式
c++·设计模式·原型模式
hy____1232 小时前
字符串函数和结构题内存对齐
c语言·算法
YoloMari3 小时前
Leetcode刷题-枚举右,维护左
python·算法·leetcode
17´3 小时前
Qt从入门到入土(十) -数据库操作--SQLITE
数据库·c++·qt·sqlite
东雁西飞4 小时前
MATLAB 控制系统设计与仿真 - 26
开发语言·算法·matlab·工业机器人·智能机器人