概述
本题目比较简单,主要考察的是关于标准输入输出、字符串处理以及循环语法的使用。题目版权归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)) # 将变最终坐标按格式进行输出
提交结果:
对比很明显,无论从代码量还是运算速度,或是逻辑思维角度看,第二种方法是更为简便与清晰。