Python CSP 201803 2 碰撞的小球

2021-10-10 05:44:41 字數 2927 閱讀 7796

對於碰到邊界又可以細分為兩種:

先定義了三個函式move、check_attack和change_directmove函式根據小球的移動方向來移動小球;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)

print

(' '

.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發生碰撞,速度反向,第三個小球碰到牆壁...