import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
static class pair {
double a;
double b;
public pair(double a, double b) {
this.a = a;
this.b = b;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return (int) a;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
pair p = (pair) obj;
return this.a == p.a && this.b == p.b;
}
}
public static void main(String[] args)throws IOException {
PrintWriter out = new PrintWriter(System.out);
StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(System.in));
Set<pair> set = new HashSet<>();
Set<pair> point = new HashSet<>();
in.nextToken();
int n = (int) in.nval;
for (int i = 0; i < n; i++) {
in.nextToken();
double a = in.nval;
in.nextToken();
double b = in.nval;
set.add(new pair(a, b));
}
int len = set.size();
List<pair> arr = new ArrayList<>();
arr.addAll(set);
int ans = 2; // 第一条直线把平面分成两块
for (int i = 1; i < len; i++) {
point.clear();// 记得清零
for (int j = 0; j < i; j++) {
double a1 = arr.get(i).a;
double a2 = arr.get(j).a;
double b1 = arr.get(i).b;
double b2 = arr.get(j).b;
if (a1 == a2) {
continue; // 平行没有交点
}
double x = (b2 - b1) / (a1 - a2);
double y = a1 * x + b1;
point.add(new pair(x, y));
}
ans += (point.size() + 1);
}
out.println(ans);
out.flush();
}
}
题目描述
平面上有 �N 条直线,其中第 �i 条直线是 �=��×�+��y=Ai×x+Bi。
请计算这些直线将平面分成了几个部分。
输入描述
第一行包含一个整数 �N。
以下 �N 行,每行包含两个整数 ��,��Ai,Bi。
其中,1≤�≤1000,−105≤��,��≤1051≤N≤1000,−105≤Ai,Bi≤105。
输出描述
一个整数代表答案。
输入输出样例
示例
输入
3
1 1
2 2
3 3
输出
6
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M