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 }

转载于:https://www.cnblogs.com/mengxm-lincf/archive/2011/06/10/2078024.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值