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

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

相关推荐
星星火柴93613 分钟前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑1 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟3 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀3 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1123 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧3 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
阿巴~阿巴~3 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
myzzb4 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
旺小仔.4 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng5144 小时前
C++ STL-string类底层实现
前端·c++·算法