注解
1、判断给定的两个点之间有没有整数点。首先应该求两个点的横纵坐标的绝对值之差。如果大于给定的半径范围就是Out of Range,否则比较这两个差值。如果差值相等,说明是等腰直角三角形,只有直角边长为1时才能“看见”彼此(也就是中间没有整数点),否则都不能“看见”彼此(中间有整数点)。如果差值不相等,就求出这两个差值的差值。如果这两个点的横坐标或纵坐标相同,那么另外一个坐标相差1时,才能“看见”彼此(中间没有整数点),否则都看不见彼此(中间有整数点)。除了以上这些情况,就要求GCD了。把给定的两个点想象成直角三角形的两个边,求斜边。只有当两个直角边的边长的最大公约数为1时,斜边才不经过其他整数点。否则斜边都经过其他整数点。
代码
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a, int b){
return a%b==0?b:gcd(b, a%b);
}
int main() {
int L;
cin>>L;
while(L) {
int sx, sy, px, py;
cin>>sx>>sy>>px>>py;
if(abs(px)>L || abs(py)>L) {
cout<<"Out Of Range"<<endl;
} else {
int absX = abs(px-sx);
int absY = abs(py-sy);
if(absX<absY){
swap(absX, absY);
}
if(absX==absY){
if(absX==1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
else{
if(absY==0){
if(absX==1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
else{
if(gcd(absX, absY)==1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
}
cin>>L;
}
return 0;
}