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

发布于:2025-03-15 ⋅ 阅读:(15) ⋅ 点赞:(0)

时间限制: 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 个操作后的位置。

样例输入:

3 2
10 10
0 0
10 -20
1 -1
0 0

样例输出:

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进行偏移

代码实现

代码实现(思路一(先输入再计算)):
#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;
}
代码实现(思路一(边输入边计算)):
#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;
}

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


网站公告

今日签到

点亮在社区的每一天
去签到