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;
}
欢迎大家和我沟通交流(✿◠‿◠)