WisKey的眼神
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2059 Accepted Submission(s): 625
Problem Description
WisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵呵.
但是Rabbit总是喜欢扮神秘,一天WisKey去食堂排队等着买饭,突然收到一道短消息,是Rabbit发的,”呵呵,又看见你了,你没看到我吧”.WisKey马上拉长脖子扫描食堂,可是就是看不到,再发短信问Rabbit在哪,Rabbit回信曰”我已经在寝室了”.WisKey无语....
假设食堂是个正方形,食堂中心坐标为(0,0),长度为2*L, WisKey保证在食堂内.
因为是吃饭高峰期,所以每个点上都站着人,当某些人处在同一直线上时就有可能被前面的人挡住.
聪明的ACMer请你帮帮WisKey,告诉他能不能看见Rabbit.
但是Rabbit总是喜欢扮神秘,一天WisKey去食堂排队等着买饭,突然收到一道短消息,是Rabbit发的,”呵呵,又看见你了,你没看到我吧”.WisKey马上拉长脖子扫描食堂,可是就是看不到,再发短信问Rabbit在哪,Rabbit回信曰”我已经在寝室了”.WisKey无语....
假设食堂是个正方形,食堂中心坐标为(0,0),长度为2*L, WisKey保证在食堂内.
因为是吃饭高峰期,所以每个点上都站着人,当某些人处在同一直线上时就有可能被前面的人挡住.
聪明的ACMer请你帮帮WisKey,告诉他能不能看见Rabbit.
Input
输入L,sx,sy,px,py; L<=1000,sx,sy是WisKey的坐标,px,py是Rabbit的坐标.
以L=0为结束.
以L=0为结束.
Output
对于每组输入数据,能看见输出”Yes”,看不见输出”No”.
Rabbit不在食堂输出”Out Of Range”.
Rabbit不在食堂输出”Out Of Range”.
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
Source
Recommend
最后知道真相的我眼泪掉下来...
简单数学几何题:
方法1: 遍历两点间的点,判断是否存在整数点。(这种搞了挺久..发现很难写对..最后看Ice_crazy的)
方法2:做一个直角三角形,两直角边的最大公约数不唯一则存在整数点。
有个小疑问,为什么5 0 0 1 0 要输出No呢,不是挡不到吗
1 //218MS 204K 855B G++ 2 #include<stdio.h> 3 int abs(int a) 4 { 5 return a<0?-a:a; 6 } 7 int main(void) 8 { 9 int l,x1,x2,y1,y2; 10 while(scanf("%d",&l)!=EOF && l) 11 { 12 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 13 if(abs(x2)>l || abs(y2)>l){ 14 puts("Out Of Range");continue; 15 } 16 if(x1==x2 || y1==y2){ 17 puts("No");continue; 18 } 19 int c1=(y2-y1)*x1; 20 int c2=(x2-x1)*y1; 21 22 int ln=x1>x2?x2:x1; 23 int rn=x1>x2?x1:x2; 24 int flag=1; 25 for(int i=ln+1;i<rn;i++){ 26 double y=(((y2-y1)*i-c1+c2)*1.0/(x2-x1)); 27 if((int)y==y){ 28 flag=0;break; 29 } 30 } 31 if(flag) puts("Yes"); 32 else puts("No"); 33 } 34 return 0; 35 } 36 37 /* 38 5 0 0 1 1 39 5 0 0 2 0 40 5 0 0 6 6 41 5 0 0 -1 -1 42 43 5 0 0 0 2 44 5 0 0 1 0 45 5 0 0 0 1 46 */
1 #include<stdio.h> 2 int gcd(int a,int b) 3 { 4 if(a%b==0) return b; 5 else return gcd(b,a%b); 6 7 } 8 int abs(int a) 9 { 10 return a<0?-a:a; 11 } 12 int main(void) 13 { 14 int l,x1,x2,y1,y2; 15 while(scanf("%d",&l),l) 16 { 17 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 18 if(abs(x2)>l || abs(y2)>l){ 19 puts("Out Of Range");continue; 20 } 21 if(x1==x2 || y1==y2){ 22 puts("No");continue; 23 } 24 int a=abs(x1-x2); 25 int b=abs(y1-y2); 26 if(a<b){ 27 int temp=a;a=b;b=temp; 28 } 29 if(gcd(a,b)==1) puts("Yes"); 30 else puts("No"); 31 } 32 return 0; 33 }