題目描述
兔八哥躲藏在樹林旁邊的果園裏。果園有M×N 棵樹,組成一個 M 行 N 列的矩陣,水平或垂直相鄰的兩棵樹的距離爲 1。兔八哥在一棵果樹下。
獵人揹着獵槍走進了果園,他爬上一棵果樹,準備殺死兔八哥。
如果獵人與兔八哥之間沒有其它的果樹,獵人就可以看到兔八哥。
現己知獵人和兔八哥的位置,編寫程序判斷兔子所在的位置是否安全.
輸入格式
第一行爲 n,表示有 n組數據,每組數據的第一行爲兩個正整數 ax 和 ay,表示獵人的位置,第二行爲兩個正整數 bx 和 by,表示兔八哥的位置。
輸出格式
共有 n 行,每行爲 yes
或 no
表示兔八哥的位置是否安全。
輸入輸出樣例
輸入 #1複製
1 1 1 1 2
輸出 #1複製
no
說明/提示
1≤n≤10^5,1≤ax,ay,bx,by≤10^8。
【算法分析】這個題目主要是需要知道如果兩個點橫座標之差與縱座標之差互質,那麼這兩個點之間就不可能有其它的點了。
我們假定如果兔子在a,獵人在c,中間有點b,那麼cx/cy=bx/by的,因爲cx,cy,bx,by均爲整數,那麼當cx和cy互質的時候,我們可以無法找到整數bx,by滿足bx/by=cx/cy,否則的話,我們可以令bx=cx/k,by=cy/k,k爲gcd(cx,cy)。所以要判斷兩個點中有沒有點其實就是判斷他們的座標之差是否互質。
【代碼實現】
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)//求a和b的最大公約數
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(gcd(abs(a-c),abs(b-d))!=1)//判斷座標之差是否互質
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}