NYIST格点

来源:互联网 发布:linux查询cpu个数 编辑:程序博客网 时间:2024/06/09 22:55

看到这道题我的第一想法就是一一列举判断从第一个点到第二个之间的点是不是在这条直线上并且都是整数点。

方法一:

判断这些点是不是整点的办法,y=(y2-y1)*(x-x1)/(x2-x1)+y1;如果(y2-y1)*(x-x1)/(x2-x1)为整数,则Y为整数。判断它是否为整数即(y2-y1)*(x-x1)%(x2-x1)==0.

下面是AC的代码:

  #include<cstdio>int main(){        int cas,x1,y1,x2,y2,ans,i;        scanf("%d",&cas);        while(cas--)        {            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);            if(x1==y1&&y1==x2&&x2==y2)            {                printf("(%d,%d),(%d,%d)\n",x1,y1,x2,y2);            }            else if(x1==x2)            {                for(i=y1;i!=y2;y1>y2?i--:i++)                   printf("(%d,%d),",x1,i);                   printf("(%d,%d)\n",x2,y2);            }            else if(y1==y2)            {                for(i=x1;i!=x2;x1>x2?i--:i++)                   printf("(%d,%d),",i,y1);                printf("(%d,%d)\n",x2,y2);            }            else            {  printf("(%d,%d),",x1,y1);                if(x1>x2)                {                  for(i=x1-1;i>x2;i--)                     {                        if((long long)(i-x1)*(y2-y1)%(x2-x1)==0)                          {                             ans=(long long)(i-x1)*(y2-y1)/(x2-x1)+y1;                             printf("(%d,%d),",i,ans);                          }                     }                }                else                {                  for(i=x1+1;i<x2;i++)                     {                         if((long long)(i-x1)*(y2-y1)%(x2-x1)==0)                            {                                ans=(long long)(i-x1)*(y2-y1)/(x2-x1)+y1;                                printf("(%d,%d),",i,ans);                            }                     }                }                printf("(%d,%d)\n",x2,y2);            }        }        return 0;}                

方法二:

这个规律是看了解题报告之后才AC的。

可以发现两个端点之间的个点数就是gcdabsx1-x2,abs(y1-y2)-1.

 #include<cstdio>int gcd(int a,int b){        if(b==0)  return a;        else    return gcd(b,a%b);}int abs(int m){        if(m>0)           return m;        else          return -m;}int main(){        int num,x1,y1,x2,y2,dx,dy,cas;        scanf("%d",&cas);        while(cas--)       {         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);         num=gcd(abs(x2-x1),abs(y2-y1));         dx=(x2-x1)/num;         dy=(y2-y1)/num;         printf("(%d,%d)",x1,y1);         while(x1!=x2||y1!=y2)         {                 x1+=dx;                 y1+=dy;                 printf(",(%d,%d)",x1,y1);         }         printf("\n");       }         return 0;}        



原创粉丝点击