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 }
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 }