四平市网站建设_网站建设公司_全栈开发者_seo优化
2025/12/30 22:52:39 网站建设 项目流程

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

// 读取输入:N(点位数量)、基地X0、Y0
int N = scanner.nextInt();
int x0 = scanner.nextInt();
int y0 = scanner.nextInt();

// 存储「最简斜率」的计数(键:斜率的最简分数形式,值:出现次数)
Map<String, Integer> directionMap = new HashMap<>();

for (int i = 0; i < N; i++) {
int xi = scanner.nextInt();
int yi = scanner.nextInt();

// 计算相对基地的偏移量
int dx = xi - x0;
int dy = yi - y0;

// 生成最简形式的方向标识
String direction = getReducedForm(dx, dy);

// 记录该方向
directionMap.put(direction, directionMap.getOrDefault(direction, 0) + 1);
}

// 不同方向的数量就是最小路线数
System.out.println(directionMap.size());

scanner.close();
}

// 将(dx, dy)约分为最简分数形式,返回唯一标识字符串
private static String getReducedForm(int dx, int dy) {
if (dx == 0 && dy == 0) {
return "0,0"; // 理论上不会出现(基地本身不是拾取点)
}

// 计算最大公约数(GCD)
int gcd = gcd(Math.abs(dx), Math.abs(dy));
if (gcd != 0) {
dx /= gcd;
dy /= gcd;
}

// 统一符号:让分子为正(若分子为0,让分母为正),避免(-1,1)和(1,-1)被误判为不同方向
if (dx < 0) {
dx = -dx;
dy = -dy;
} else if (dx == 0) {
if (dy < 0) {
dy = -dy;
}
}

return dx + "," + dy;
}

// 计算两个数的最大公约数(欧几里得算法)
private static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询