1. 程式人生 > >ZZULIOJ 2509: 建國的穿越

ZZULIOJ 2509: 建國的穿越

題目描述

    建國今天正在吃披薩,突然被傳送到一個異次元世界,他發現這裡是一個沒有邊界的二維世界,而他只有找到可以傳送他的傳送門才能順利地回到自己的世界,但是這個異次元世界中存在著許多無法穿過的環形魔法陣,魔法陣內的人無法出來,魔法陣外的人也無法進去。現在給你建國的位置,傳送門的位置以及魔法陣的範圍,請你告訴建國能否回到自己的世界,若可以則輸出"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;
	}
}