python 三體問題

2021-10-25 02:30:49 字數 4383 閱讀 2888

沈學姐是乙個科幻**愛好者,最近她讀了《三體》,喜歡數學的學姐對三體問題產生了興趣。當然,學姐並不想去算某顆行星的軌道。

她把整個三體星系簡化為乙個平面,三顆恆星的球心投影成平面上的三點,每顆恆星都有乙個半徑為r的圓形引力場(r由恆星自身屬性決定)。學姐想知道,三顆恆星的引力場總面積是多少。

第一行為乙個整數t,表示資料組數。

每組資料有三行輸入:

每行有三個數x,y,r(保留兩位小數),分別為該恆星中心座標(x,y)和引力場半徑r。

(|x|<=5,|y|<=5,0<=r<=5)

對於第i組資料,輸出一行,形如「case #i: ans」(不含引號)

其中,ans表示引力場總面積,保留整數部分(因為學姐不想太難)。

樣例輸入

2

0.00

0.00

1.00

0.00

2.00

1.00

2.00

0.00

1.00

0.00

0.00

5.00

1.00

1.00

2.22

2.00

0.00

1.00

樣例輸出

case #1: 9

case #2: 79

#encoding :utf-8

import math

""" double ang1=acos((r1*r1+d*d-r2*r2)/(2*r1*d));

double ang2=acos((r2*r2+d*d-r1*r1)/(2*r2*d));

return ang1*r1*r1 + ang2*r2*r2 - r1*d*sin(ang1);

"""def

judge

(list1,list2)

:#judge函式用來判定兩圓之間的關係

d =((list1[0]

-list2[0]

)**2+

(list1[1]

-list2[1]

)**2)

**0.5

if d >= list1[2]

+list2[2]

:#此時兩個圓相切或者相離

return

1elif

abs(list1[2]

-list2[2]

)+list2[2]

:#相交但不包含

return

0elif

abs(list1[2]

-list2[2]

)>=d:

return-1

#其中乙個圓包含另乙個

#返回不相交時的面積

defnocoincidearea

(list1,list2)

: area = math.pi*

(list1[2]

*list1[2]

+list2[2]

*list2[2]

)return

round

(area)

#返回相交時的面積

defcoincidearea

(list1,list2)

: d = math.sqrt(

(list1[0]

- list2[0]

)**2+

(list1[1]

- list2[1]

)**2)

ang1 = math.acos(

((list1[2]

*list1[2]

)+ d**2-

(list2[2]

*list2[2]

))/(

2*d*list1[2]

))ang2 = math.acos(

((list2[2]

)**2+ d **2-

(list1[2]

)**2)

/(2* d * list2[2]

))thecoincide = ang1*list1[2]

*list1[2]

+ang2*list2[2]

*list2[2]

-list1[2]

*d*math.sin(ang1)

area =

(math.pi*

(list1[2]

*list1[2]

+list2[2]

*list2[2]

))-thecoincide

return

round

(area)

#判斷三個圓知否存在包含關係,存在則刪除被包含的那個圓

defisinclude

(list)

: includelist =

if judge(list[0]

,list[1]

)==-1

:ifmin(list[0]

[2],list[1]

[2])

== list[0]

[2]:

0)else:1

)#表示圓0包含圓1

if judge(list[0]

,list[2]

)==-1

:ifmin(list[0]

[2],list[2]

[2])

== list[0]

[2]:

0)else:2

)#表示圓0包含圓2

if judge(list[1]

,list[2]

)==-1

:ifmin(list[1]

[2],list[2]

[2])

== list[1]

[2]:

1)else:2

)#表示圓1包含圓2

#開始刪除被包含的圓

if includelist:

includelist =

list

(set

(includelist)

)for i in

sorted

(includelist,reverse=

true):

list.pop(i)

t =eval

(input()

)#表示共幾組資料

sumlist =

for i in

range

(t):

data =

sum=

0for j in

range(3

):#輸入三個點的座標和半徑

list

(map

(float

,input()

.split())

))#判斷三個圓之間是否存在包含關係

tempdata = data[:]

isinclude(tempdata)

iflen

(tempdata)==1

:round

(math.pi*tempdata[0]

[2]*tempdata[0]

[2])

)elif

len(tempdata)==2

:if judge(tempdata[0]

, tempdata[1]

)==1:

0], tempdata[1]

))elif judge(tempdata[0]

, tempdata[1]

)==0:

# 則表示兩個圓有相交0]

, tempdata[1]

))else

:#包含關係,僅在排除不存在包含關係之後

for j in

range

(len

(tempdata)-1

):for k in

range

(j+1

,len

(tempdata)):

if judge(data[i]

,data[k])==

1:sum+=nocoincidearea(data[i]

,data[k]

)elif judge(data[i]

,data[k])==

0:#則表示兩個圓有相交

sum+=coincidearea(data[i]

,data[k]

)round

(sum/2

))print

("case #"

+str

(i+1)+

": "

+str

(sumlist[i]

))

鴿者文明的三體問題 (數學)

思路 題目的太概意思就是給你很多個三角形區域,平面中的點滿足在乙個三角形區域就被覆蓋了一次,如果覆蓋了奇數次就存在引力,否則不存在。那麼這道題的關鍵就是去判斷點 xqi,yqi 是否在三角形區域內。判斷p點是否在三角形內部 用面積法去判定 如果在三角形內部就必須滿足 sabc s abp sacp ...

暴力列舉 三體問題 快讀模板

三體人將對地球發起攻擊。為了抵禦攻擊,地球人派出了 a b c 艘戰艦,在太空中排成乙個 a 層 b 行 c 列的立方體。其中,第 i 層第 j 行第 k 列的戰艦 記為戰艦 i,j,k 的生命值為 d i,j,k 三體人將會對地球發起 m 輪 立方體攻擊 每次攻擊會對乙個小立方體中的所有戰艦都造成...

希伯來大學研究人員提出解決「三體問題」的新方法

據外媒報道,希伯來大學研究人員介紹了一種解決三體問題的新方法,並 其結果統計。三體問題 是指三個質量 初始位置和初始速度都是任意的可視為質點的天體,在相互之間萬有引力的作用下的運動規律問題,對於理解各種天體物理過程以及一大類機械問題至關重要。三個多世紀以來,它一直佔據著世界上一些最優秀的物理學家 天...