题目描述
兔八哥躲藏在树林旁边的果园里。果园有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;
}