沈學姐是乙個科幻**愛好者,最近她讀了《三體》,喜歡數學的學姐對三體問題產生了興趣。當然,學姐並不想去算某顆行星的軌道。
她把整個三體星系簡化為乙個平面,三顆恆星的球心投影成平面上的三點,每顆恆星都有乙個半徑為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 輪 立方體攻擊 每次攻擊會對乙個小立方體中的所有戰艦都造成...
希伯來大學研究人員提出解決「三體問題」的新方法
據外媒報道,希伯來大學研究人員介紹了一種解決三體問題的新方法,並 其結果統計。三體問題 是指三個質量 初始位置和初始速度都是任意的可視為質點的天體,在相互之間萬有引力的作用下的運動規律問題,對於理解各種天體物理過程以及一大類機械問題至關重要。三個多世紀以來,它一直佔據著世界上一些最優秀的物理學家 天...