看到這道題我的第一想法就是一一列舉判斷從第一個點到第二個之間的點是不是在這條直線上並且都是整數點。
方法一:
判斷這些點是不是整點的辦法,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;
}