题目描述
用时
50min,稍长
但是当年用C语言整整写了一个下午还没搞出来
让我用面向过程的语言写这种题还不如弄死我
思路
一切皆对象
小球是一个类
有位置和速度的属性
有运动和碰撞的方法
每秒让所有的小球都调用一次运动的方法,更新位置
然后停住
判断此刻是否碰了墙或者其他小球
如果碰了则速度反向
到时间后输出每个小球对象的位置属性
就这么简单
满分代码
class Ball():
# 当前坐标
position = 0
# 当前速度,右正左负
speed = 1
def __init__(self, position):
# 初始化坐标
self.position = position
def move(self):
# 每调用一次则坐标+1或-1
self.position += self.speed
def hit(self):
# 碰撞后速度反向
self.speed *= -1
# 传入一个小球对象、所有球对象的list、线段的长度
def hit_judger(the_ball, all_balls, line_length):
# 如果碰到了线段首尾
if the_ball.position == 0 or the_ball.position == line_length:
the_ball.hit()
else:
for one_ball in all_balls:
# 判断与其他球是否碰撞时不能把本球计算在内
if one_ball is not the_ball:
# 若碰撞到其他的球(最多只能碰一个)
if the_ball.position == one_ball.position:
# 则改变自己的速度
the_ball.hit()
break
return
if __name__ == '__main__':
ball_nums, line_length, time_cost = map(int, input().split())
orig_positions = list(map(int, input().split()))
all_balls = []
for op in orig_positions:
# 初始化所有小球对象并添加至list中
all_balls.append(Ball(op))
for tc in range(time_cost):
for one_ball in all_balls:
# 所有的球运动1s
one_ball.move()
for the_ball in all_balls:
# 依次判断是否碰撞
hit_judger(the_ball, all_balls, line_length)
for one_ball in all_balls:
print(one_ball.position, end=' ')
总结
判断是否碰撞的 hit_judger
方法开始出了个小bug,在这debug了十分钟
开始时是这样写的
if the_ball.position == one_ball.position:
# 则两球同时改变速度
the_ball.hit()
one_ball.hit()
然后发现比如第二个球碰了第三个球
那检测第二个球时把两个球的速度都改变了
检测第三个球时因为位置没变,所以认为又发生了一次碰撞
又把两个球的速度变回去了
这里踩坑了
把所有球每秒的速度和位置都输了出来才找到bug
然后就是天杀的CCF又在split上做手脚了
题目里明说的用空格分割,我用了split(' ')
给我报运行错误了
坑爹呢