ZZULIOJ 2509: 建國的穿越
阿新 • • 發佈:2019-01-11
題目描述
建國今天正在吃披薩,突然被傳送到一個異次元世界,他發現這裡是一個沒有邊界的二維世界,而他只有找到可以傳送他的傳送門才能順利地回到自己的世界,但是這個異次元世界中存在著許多無法穿過的環形魔法陣,魔法陣內的人無法出來,魔法陣外的人也無法進去。現在給你建國的位置,傳送門的位置以及魔法陣的範圍,請你告訴建國能否回到自己的世界,若可以則輸出"Yes",否則輸出"No"。
輸入
第一行輸入一個整數T,表示樣例數量。(1 <= T <= 100)
接下來輸入T個樣例,每個樣例第一行先輸入一個整數n,表示魔法陣的數量。(1 <= n <= 1000)
第二行輸入兩個整數Bx,By,表示建國現在所在位置的座標。 (-1000 <= Bx,By <= 1000)
第三行輸入兩個整數Ex,Ey,表示傳送門的位置的座標。(-1000 <= Ex,Ey <= 1000)
(資料保證Rikka現在所在位置與傳送門不會出現在魔法陣的邊界上。)
接下來n行每行輸入三個整數xi,yi,r,表示魔法陣的位置。(-1000 <= xi,yi <= 1000 , 1 <= r <= 1000 , 資料保證任意兩個魔法陣之間不會出現交點,即任意兩個魔法陣只會外離或內含)
輸出
對於每個樣例,輸出"Yes"or"No"。
樣例輸入 Copy
2 1 0 0 1 1 0 0 1 2 0 0 1 1 0 0 10 0 0 100
樣例輸出 Copy
No Yes
分析:本題看似有點類似於走迷宮的搜尋題,其實就是判斷起點和終點每次是否在一個圈裡或全都在圈外,逐個判斷即可。只要有一個不符合要求直接輸出No即可。
#include<iostream> #include<cmath> using namespace std; double dist(int sx,int sy,int rx,int ry) { return sqrt((sx-rx)*(sx-rx)+(sy-ry)*(sy-ry));//計算起點到魔法陣中心點的距離(需求半徑) } int main() { int t,sx,sy,ex,ey,n,x,y; double r; bool flag; cin>>t; while(t--) { cin>>n; cin>>sx>>sy;//輸入終點 cin>>ex>>ey;//輸入起點 flag=true; for(int i=1;i<=n;i++) { cin>>x>>y>>r;//輸入魔法陣座標及半徑 if(r>dist(sx,sy,x,y)&&r<dist(ex,ey,x,y))//如果魔法陣半徑大於需求半徑即起點在圈內 { //如果魔法陣半徑小於需求半徑即終點在圈外 flag=false; //這種情況則不符合條件 } if(r<dist(sx,sy,x,y)&&r>dist(ex,ey,x,y))//如果魔法陣半徑小於需求半徑即起點在圈外 { //如果魔法陣半徑大於需求半徑即終點在圈內 flag=false; //這種情況也不符合條件 } } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }