看到这道题我的第一想法就是一一列举判断从第一个点到第二个之间的点是不是在这条直线上并且都是整数点。
方法一:
判断这些点是不是整点的办法,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的。
可以发现两个端点之间的个点数就是gcd(abs(x1-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;
}