直线方程:y=kx+b
确定最初的点(x0,y0)
后,询问的每个点到该点都看作一个向量。
计算好每个点(x1,y1)
到点(x0,y0)
的差值。
即y=y1-y0
、x=x1-x0
由于我们选取了最初的x0、y0
作为参照点来处理每个点,类似于向量。
所以我们可以将各点的直线方程的b值看作0
即y1-y0=k(x1-x0)
即为y=kx,k=y/x
。
相当于y
和x
的比值为k
倍。
由于比值k只和x、y有关系,
所以我们可以将问题转换成去求x、y
的最大公约数k
。
我们知道y/x=k
,如何进一步确定是同一条直线?
同一条直线相当于各个点y/x
的比值均相同
即我们的y/x
中的y、x
同除于k
这样就可以将相同直线情况的点简化到一起。
再将其加入到set
中,set
的大小有多大就需要发射多少条不同的射线。
Java中我们用字符串形式的set
去存储对应的x、y
结果时,运算是用对应的字符串的String.valueOf来进行处理。
如果直接处理再加入set
中会WA
。
import java.util.*;
public class Main{
public static int gcd(int a,int b){
while(b!=0){
int temp=a%b;
a=b;
b=temp;
}
return a;
}
public static void main(String []args){
Scanner sc=new Scanner(System.in);
Set<String>set=new HashSet<>();
int T=sc.nextInt();
int a=sc.nextInt();
int b=sc.nextInt();
while(T-->0){
int x=sc.nextInt();
int y=sc.nextInt();
x-=a;
y-=b;
int d=gcd(x,y);
String s=String.valueOf(y/d)+" "+String.valueOf(x/d);
set.add(s);
}
System.out.println(set.size());
}
}
import java.util.*;
public class Main{
public static int gcd(int a,int b){
while(b!=0){
int temp=a%b;
a=b;
b=temp;
}
return a;
}
public static void main(String []args){
Scanner sc=new Scanner(System.in);
Set<String>set=new HashSet<>();
int T=sc.nextInt();
int a=sc.nextInt();
int b=sc.nextInt();
while(T-->0){
int x=sc.nextInt();
int y=sc.nextInt();
x-=a;
y-=b;
int d=gcd(x,y);
x/=d;y/=d;
if(x<0)x=-x;y=-y;
set.add(x+" "+y);
}
System.out.println(set.size());
}
}