Description
WisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵呵.
但是Rabbit总是喜欢扮神秘,一天WisKey去食堂排队等着买饭,突然收到一道短消息,是Rabbit发的,”呵呵,又看见你了,你没看
到我吧”.WisKey马上拉长脖子扫描食堂,可是就是看不到,再发短信问Rabbit在哪,Rabbit回信曰”我已经在寝室了”.WisKey无
语....
假设食堂是个正方形,食堂中心坐标为(0,0),长度为2*L, WisKey保证在食堂内.
因为是吃饭高峰期,所以每个点上都站着人,当某些人处在同一直线上时就有可能被前面的人挡住.
聪明的ACMer请你帮帮WisKey,告诉他能不能看见Rabbit.
Output
Sample Input
5 0 0 1 1
5 0 0 2 0
5 0 0 6 6
5 0 0 -1 -1
0
Sample Output
Yes
No
Out Of Range
Yes
其实这道题有无那个图都是一样的,有了的话的却给了我们一个很直观的印象,但反倒影响了我们的思维。当时我就在图上一顿找玄机,结果比赛结束了也没有过,还记得我当时的错误想法是看看座标间能不能整除。听了题解后才明白,哦原来是gcd啊!!!!用gcd的合理性也很明显,若gcd(abs(px-sx),abs(py-sy))==1,就说两点连线上再也没有其他的坐标了。一开始补题的的时候,我想到了一组样例 6 2 3 3 6 根据这组样例 我的想法是gcd(px,sx)==1 || gcd(py,sy)==1 对这组样例来说倒是满足,带着不安试一试吧!交上去WA了。想了想,想到了5 2 1 4 5 对横纵坐标分别求gcd也符合了判断条件,但把两个点连起来发现,直线穿过了(2,2)这个点。再想了想,于是便有了解。*************************(补充一句 我刚开始以为一个非0整数不能和0求gcd于是还加了个特判的条件,但又写了个gcd测试以后发现0与非0整数求gcd得那个非0整数,当然了不加这特判条件也是可以过的)。
有什么不合理的地方 请各位大佬为在下指出~~~~~
#include<bits/stdc++.h>
int abs(int x){
return x>0?x:-x;
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
int L,sx,sy,px,py;
while(scanf("%d",&L)==1&&L){
scanf("%d %d %d %d",&sx,&sy,&px,&py);
if(abs(px)>L||abs(py)>L){
printf("Out Of Range\n");
continue;
}
if(abs(px-sx)==1&&abs(py-sy)==1){
printf("Yes\n");
}
else if((gcd(abs(px-sx),abs(py-sy))==1)&&abs(px-sx)!=0&&abs(py-sy)!=0){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}