對於碰到邊界又可以細分為兩種:
先定義了三個函式move、check_attack和change_direct
,move函式
根據小球的移動方向來移動小球;check_attack函式
根據小球的位置判斷是否發生了碰撞;change_direct函式
是在小球發生碰撞的情況下變更碰撞小球的移動方向。# 題目:碰撞的小球
defmove
(lis,direct)
:'''
移動小球,返回移動後的列表
lis為小球列表
direct為小球的方向列表
'''for i in
range
(len
(lis)):
if direct[i]==1
: lis[i]+=1
else
: lis[i]-=1
return lis
defcheck_attack
(lis)
:'''
發生碰撞時返回true
否則返回false
'''set1 =
set(lis)
iflen
(set1)
==len
(lis)
:return
false
else
:return
true
defchange_direct
(lis,direct)
:'''
當小球間發生碰撞或小球遇到邊界時,變更碰撞小球的方向
'''if lis[lis.index(
min(lis))]
==0:#最左側的小球發生碰撞時
direct[lis.index(
min(lis))]
*=-1if lis[lis.index(
max(lis))]
==l:
#最右側的小球發生碰撞時
direct[lis.index(
max(lis))]
*=-1if check_attack(lis)
:#中間有小球發生碰撞時
for i in
range
(len
(lis)):
for j in
range
(len
(lis)):
if lis[i]
==lis[j]
and i!=j and i
#若兩個小球位置相同,不為同乙個小球,只操作一次
## print(i,j)
direct[i]*=-
1 direct[j]*=-
1break
return direct
if __name__ ==
'__main__'
: n,l,t =
input()
.split(
) direct =
#各個小球移動的方向
n =int(n)
l =int(l)
t =int(t)
lis =
list
(input()
.split())
for i in
range
(len
(lis)):
#轉換型別為int
lis[i]
=int
(lis[i])1
)#初始化所有小球方向
## print(lis)
## print(direct)
for i in
range(1
,t+1):
#t秒的過程
direct = change_direct(lis,direct)
## print(lis,direct)
lis = move(lis,direct)
(' '
.join(
str(i)
for i in lis)
)
201803 2碰撞的小球
問題描述 提示因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。同時也可以證明兩個小球發生碰撞的位置一定是整數 但不一定是偶數 輸入格式 輸入的第一行包含三個整數n,l,t,用空格分隔,分別表示小球的個數 線段長度...
201803 2碰撞的小球
問題描述 提示因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。同時也可以證明兩個小球發生碰撞的位置一定是整數 但不一定是偶數 輸入格式 輸入的第一行包含三個整數n,l,t,用空格分隔,分別表示小球的個數 線段長度...
201803 2 碰撞的小球
一秒後,三個小球的位置分別為5,7,9。兩秒後,第三個小球碰到牆壁,速度反向,三個小球位置分別為6,8,10。三秒後,第二個小球與第三個小球在位置9發生碰撞,速度反向 注意碰撞位置不一定為偶數 三個小球位置分別為7,9,9。四秒後,第乙個小球與第二個小球在位置8發生碰撞,速度反向,第三個小球碰到牆壁...