当前位置: 首页 > news >正文

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 个操作后的位置。

样例输入:

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

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

相关文章:

  • Xshell连接autodl时提示ssh服务器拒绝了密码,请再试一次
  • 【大模型学习】第十九章 什么是迁移学习
  • 微店关键词搜索商品详情API接口解析与应用
  • C++双端队列知识点+习题
  • ollama下载的DeepSeek的模型(Model)文件在哪里?(C盘下)
  • 【vue3学习笔记】(第144-146节)reactive函数;回顾vue2响应式原理;vue3响应式原理_proxy
  • 问deepseek: k-epsilon湍流模型,公式原理推导
  • 【基于ESP32-S3的多线程工业级温度监测系统】
  • 【业务场景实战】数据增量同步
  • 【计算机网络 第8版】谢希仁编著 第一章概述 课后题10、11、28、34解析
  • 使用 Arduino 和 ESP8266 Wi-Fi 模块发送电子邮件
  • python字符串练习题
  • 【QT】-一文读懂抽象类
  • 限流及熔断的场景?
  • 星越L_ 常规车门解锁方式讲解
  • C#中类‌的核心定义
  • git备份or打补丁
  • TCP为什么可靠?
  • Gartner发布量子网络安全策略指南:2030年量子计算将能够破坏传统的加密算法
  • 每日十题八股-2025年3月13日-关于垃圾回收的笔记
  • 网站费用标准/找百度
  • 哪些网站建设公司/网络推广引流有哪些渠道
  • 北京品牌网站建设公司/培训心得体会
  • mindmanager网站建设流程图/百度搜索关键词查询
  • 网站的下载链接怎么做/怎样做网站的优化、排名
  • 佳木斯 网站建设/谷歌海外推广