CCF-CSP 202309-1 坐标变换(其一)

😸题目要求

对于平面直角坐标系上的坐标 ( x , y ) (x,y) (x,y),小 P 定义了一个包含 n n n 个操作的序列 T = ( t 1 , t 2 , ⋅ ⋅ ⋅ , t n ) T=(t_1,t_2,···,t_n) T=(t1,t2,⋅⋅⋅,tn)。其中每个操作 t i ( 1 ≤ i ≤ n ) t_i(1 \leq i \leq n) ti(1in) 包含两个参数 d x i dx_i dxi d y i dy_i dyi,表示将坐标 ( x , y ) (x,y) (x,y) 平移至 ( x + d x i , y + d y i ) (x+dx_i,y+dy_i) (x+dxi,y+dyi) 处。

现给定 m m m 个初始坐标,试计算对每个坐标 ( x i , y i ) ( 1 ≤ j ≤ m ) (x_i,y_i)(1 \leq j \leq m) (xi,yi)(1jm) 依次进行 T T T n n n 个操作后的最终坐标。

🐈‍⬛输入格式

从标准输入读入数据。
输入共 n + m + 1 n+m+1 n+m+1 行。
输入的第一行包含空格分隔的两个正整数 n n n m m m,分别表示操作和初始坐标个数。
接下来 n n n 行依次输入 n n n 个操作,其中第 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i(1in) 行包含空格分隔的两个整数 d x i dx_i dxi d y i dy_i dyi
接下来 m m m 行依次输入 m m m 个坐标,其中第 j ( 1 ≤ j ≤ m ) j(1 \leq j \leq m) j(1jm) 行包含空格分隔的两个整数 x j x_j xj y j y_j yj

🐈‍⬛输出格式

输出到标准输出中。
输出共 m m m 行,其中第 j ( 1 ≤ j ≤ m ) j(1 \leq j \leq m) j(1jm) 行包含空格分隔的两个整数,表示初始坐标 ( x i , y i ) (x_i,y_i) (xi,yi) 经过 n n n 个操作后的位置。

🐈‍⬛样例输入

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

🐈‍⬛样例输出

21 -11
20 -10

🐈‍⬛样例解释

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

🐈‍⬛子任务

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

😸问题解决

🐈满分代码(含逐行代码解释)

🍭C++

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n, m;
	int x[100001], y[100001]; //x,y表示坐标
	int dx[100001], dy[100001]; //dx,dy表示每次坐标变换数值
	cin >> n >> m;
	for(int i = 0; i < n; i++){
		cin >> dx[i] >> dy[i]; //循环输入每次坐标变换数值
	}
	for(int i = 0; i < m; i++){
		cin >> x[i] >> y[i]; //循环输入查询要变换的坐标个数
	}
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			x[i] += dx[j]; //对横坐标进行数值变换,累加即可
			y[i] += dy[j]; //对纵坐标进行数值变换,累加即可
		}
		cout << x[i] << " " << y[i] << endl; //输出结果时注意空格,此为题目要求!!!
	}
	return 0;
} 

🍭Python

# 代码原理与C++完全相同,此处不再一一赘述
n, m = map(int, input().split())
dx = [0] * 100001
dy = [0] * 100001
x = [0] * 100001
y = [0] * 100001

for i in range(n):
    dx[i], dy[i] = map(int, input().split())

for i in range(m):
    x[i], y[i] = map(int, input().split())

for i in range(m):
    for j in range(n):
        x[i] += dx[j]
        y[i] += dy[j]
    print(x[i], y[i])

🐈场景拓展

本题代码可以应用于解决坐标变换的问题。它主要用于对一组坐标进行平移操作,将给定的位移量(dx, dy)应用于一组初始坐标(x, y)上,然后输出平移后的坐标。
本题代码可以在以下场景中使用:

  • 图形处理:对图形进行平移操作,将图形中的点沿指定方向移动一定距离。
  • 游戏开发:处理游戏中的碰撞检测或位置更新,根据一组物体的初始位置和速度来计算它们的最终位置。
  • 数据处理:将一组数据的位置进行调整,例如在地理信息系统中对点集进行平移。
  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值