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本题并不难,但我还是错了两次而且不知到哪有问题,最开始,我的方法是将两点横坐标或纵坐标相同的情况单独考虑,然后其他情况先求出两点构成的直线的斜率,然后看两点之间的线段上是否有横纵坐标都为整数的如果有就看不到,没有就看的到,改两次改不吃来,只好换方法,发现如果看不到,说明两点构成的三角形之间有相似三角形,且横竖边长都是整数又因为两点构成的三角形横竖边长也是整数这就说明原来两点构成的三角形横竖边长有不为1的最大公约数;错误的代码#include<iostream> #include<stdio.h> using namespace std; int main() { double x1,y1; double x2,y2; int n; while(~scanf("%df",&n)) { if(n==0) break; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);//使用double是为了求斜率 int t=0; if(x2>n||x2<-n||y2>n||y2<-n)//判断是否在食堂 { printf("Out Of Range\n"); } else { if(x1==x2)//判断横坐标是否相同 { if(y1-y2==1||y2-y1==1) { printf("Yes\n"); } else { printf("No\n"); } } if(y1==y2)//判断纵坐标是否相同 { if(x1-x2==1||x2-x1==1) { printf("Yes\n"); } else { printf("No\n"); } } if(x1!=x2&&y1!=y2) { double k; k=(y2-y1)/(x2-x1);//斜率 if(x1>x2) { for(int i=x2+1;i<x1;i++) { double y3; y3=(i-x1)*k+y1;//求纵坐标 int x=y3; if(y3-x==0)//看纵坐标是否是整数 { t=1; break; } } if(t==1) printf("No\n"); else printf("Yes\n"); } else { for(int i=x1+1;i<x2;i++) { double y3; y3=(i-x1)*k+y1; int x=y3; if(y3-x==0) { t=1; break; } } if(t==1) printf("No\n"); else printf("Yes\n"); } } }} }正确代码#include<iostream> #include<stdio.h> using namespace std; int main() { int x1,y1; int x2,y2; int n; while(~scanf("%df",&n)) { if(n==0) break; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); int t=0; if(x2>n||x2<-n||y2>n||y2<-n) { printf("Out Of Range\n"); } else { if(x1==x2) { if(y1-y2==1||y2-y1==1) { printf("Yes\n"); } else { printf("No\n"); } } if(y1==y2) { if(x1-x2==1||x2-x1==1) { printf("Yes\n"); } else { printf("No\n"); } } if(x1!=x2&&y1!=y2) { int a,b,c;//a是横边长,b是纵边长 if(x1>x2) a=x1-x2; else a=x2-x1; if(y1>y2) b=y1-y2; else b=y2-y1; c=a%b; while(c!=0) { a=b; b=c; c=a%b; } if(b==1)//判断最大公约数是否是1 printf("Yes\n"); else printf("No\n");} }} }