hdu1577
http://acm.hdu.edu.cn/showproblem.php?pid=1577
对于这道题,第一个感觉是建立一个起点与终点的一条直线方程,然后测试是否有夹在起点与终点之间的整数点??????
但是这样做效率低,并且代码比较烦(本人曾敲过,悲剧的没有过),然后突然得到灵感,可以用求最大公约数来解
具体讲解如何得出此结论:
假设起点为(x1,y1),终点为(x2,y2)
当中间存在某一点(x3,y3)时,(x3-x1,y3-y1)=k*(x2-x1,y2-y1),那么我们进一步认为起始点是(0,0)时,k*(x3,y3)=(x2,y2)
(x3,y3)=(x2,y2)/k,即x2,y2存在公约数,当公约数不为1时,(x3,y3)!=(x2,y2),即起点为(x1,y1),终点为(x2,y2)中间存在一点,否则则不存在。
然后只需要得到向量(x2-x1,y2-y1)然后求解这两个量是否具有非1公约数即可
1 #include<stdio.h>
2 #include<cmath>
3 using namespace std;
4 int gcd(int a,int b)
5 {
6 return b==0?a:gcd(b,a%b);
7 }
8 int main()
9 {
10 int L,x1,y1,x2,y2;
11 while(scanf("%d",&L)==1&&L)
12 {
13 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
14 if(abs((float)x2)<=L&&abs((float)y2)<=L)
15 {
16 int x=abs((float)(x1-x2)),y=abs((float)(y1-y2));
17 if(gcd((x>y?x:y),(x>y?y:x))==1) printf("Yes\n");
18 else printf("No\n");
19 }
20 else printf("Out Of Range\n");
21 }
22 return 0;
23 }