CCF CSP认证 20230901 坐标变换(其一)满分题解 Python实现

概述

  本题目比较简单,主要考察的是关于标准输入输出、字符串处理以及循环语法的使用。题目版权归CCF所有,真题跳转官网查看
  真题来源:坐标变换(其一)
  官网地址:www.cspro.org(模拟考试入口)

题目分析

  对m个坐标(x,y)进行n次平移变换,按照给定格式,输出最终的坐标。

方法一(按部就班):

  • 首先,获取第一行给定的平移次数n,和初始坐标个数m。这里可使用字符串.split方法,和eval函数取到数字。
  • 然后,循环n次,接受input并将每个平移操作保存在列表中。
  • 接着,循环m次,接受input,将每个初始坐标保存在列表中。遍历平移操作,对每一个初始坐标进行变换,并将最终的坐标保存在结果列表中。
  • 最后,遍历结果列表,使用format函数进行格式化输出
具体实现
str_list = input().split(" ")	# 获取第一行字符串,并进行分割,去除空格
n = eval(str_list[0])	# 获取操作次数n,去除字符串的“”,转为整形或浮点型
m = eval(str_list[1])	# 获取操作次数m
n_list = []		# 平移操作列表
res_list = []	# 结果列表
while n > 0:
    n_list.append(input().split(" "))
    n -= 1
while m > 0:
    temp = input().split(" ")	# 初始坐标
    m_list = [eval(i) for i in temp]	# 将初始坐标按照列表的形式[x,y],储存在列表中(如:[[1,2],[2,3]])。
    for t in n_list:	# 遍历平移操作列表
        m_list[0] += eval(t[0])		# 平移操作
        m_list[1] += eval(t[1])		# 平移操作
    res_list.append(m_list)		# 将最终坐标存于结果列表中
    m -= 1
for coord in res_list:		# 遍历结果列表并输出
    print("{} {}".format(coord[0], coord[1]))

提交结果:
笨办法

方法二(不盲目解题,要利用数学特性)

  相信用还熟悉平移变换的你已经想起来了:单单只是多个平移操作,我们可以先叠加完成得到最终的平移操作。然后将初始坐标进行最终平移操作,即可得到结果。此外,在处理输入数据的时候,我们可利用高阶函数map方法,结合int函数对字符串分割后的结果进行处理。

具体实现
n, m = map(int, input().split(" "))		# map函数结合int,对分割后的字符串进行处理,直接得到整数
t_x = t_y = 0	# 初始平移坐标(0,0)
for i in range(n):
    x1, y1 = map(int, input().split(" "))
    t_x += x1		# 累计得到最终平移操作x
    t_y += y1		# 累计得到最终平移操作y
for i in range(m):
    x, y = map(int, input().split(" "))
    x += t_x		# 对每个初始坐标进行平移变换
    y += t_y		
    print("%d %d" % (x, y))	# 将变最终坐标按格式进行输出

提交结果:
利用数学特性
  对比很明显,无论从代码量还是运算速度,或是逻辑思维角度看,第二种方法是更为简便与清晰。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值