蓝桥杯联系题目
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z,即横坐标 是 00 到 11 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。
给定平面上 20 × 2120×21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z,即横 坐标是 00 到 1919 (包含 00 和 1919) 之间的整数、纵坐标是 00 到 2020 (包含 00 和 2020) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
思路:从左到右进行枚举, 除去斜率为0和无穷的,
根据两点式,用set进行去重,都转变为整数。
import java.util.*;
public class Main {
public static void main(String[] args) {
Set<Map<Integer , ArrayList<Integer>>> set = new HashSet<>();
for(int i = 0 ; i < 20 ; i++){
for (int j = 0 ; j < 21 ; j++){
for (int x = i+1 ; x < 20 ; x++){
for (int h = 0 ; h < 21 ; h++){
if (h==j) continue;
int a = j-h;
int b = x-i;
int c = i*h-x*j;
int k = gcd(gcd(a,b),gcd(b,c));
Map<Integer , ArrayList<Integer>> map = new HashMap<>();
ArrayList< Integer> list = new ArrayList<Integer>();
list.add(b/k);
list.add(c/k);
map.put(a/k ,list );
set.add(map);
}
}
}
}
System.out.println(set.size()+20+21);
}
static int gcd (int a , int b ){
return b==0?a:gcd(b, a%b);
}
}