• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
mengxm
博客园    首页    新随笔    联系   管理    订阅  订阅

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 }
posted @ 2011-06-10 23:40  mengxm  阅读(208)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3