*题目描述平面上有 NN 条直线,其中第 i 条直线是 y = Ai *x + Bi。
请计算这些直线将平面分成了几个部分。
输入描述
第一行包含一个整数 NN。
以下 NN 行,每行包含两个整数 Ai,Bi。
其中,10^51≤N≤1000,−105≤Ai,Bi≤105。
输出描述
一个整数代表答案。
输入输出样例
示例
输入
3
1 1
2 2
3 3
输出
6
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
思路:
当没有直线时,平面数为1,当增加一条直线时,原本的子线把这条直线分成了几段,那么就会增加几个平面。
那么现在目标就明确了:
一、分别得到这些直线。(要把重复的去掉)
哈哈,不要想着用contains了,contains不能确保ks和bs是同一条直线的。或者说用其他的方法也行。
for(int i = 0; i < num; i++) {
boolean flag = true;
k = sc.nextInt();
b = sc.nextInt();
for(int j = 0; j < i; j++) {
if(ks.get(j) == k && bs.get(j) == b) {
i--;
num--;
flag = false;//判断当前直线是否已存在
break;
}
}
if(flag) {//不存在就加入
ks.add(k);
bs.add(b);
}
}
二、分别计算每条直线与前面直线的交点数,增加面数为加点数加1;
for(int i = 1; i < num; i++) {//从第一条直线开始,依次与前面的直线相交,增加面数 为交点数加1
Set<String>points = new HashSet<>();//记录交点
int k1 = ks.get(i);
int b1 = bs.get(i);
for(int j = 0; j < i; j++) {
int k2 = ks.get(j);
int b2 = bs.get(j);
int d = gcd(b1-b2, k2-k1); //化到最简式,以防出现(4/2,2/2)和(2/1,1/1)的情况;
String xy = (b1-b2)/d+ "/"+ (k2-k1)/d+",";//计算交点横坐标x,字符串表示,以防计算式不一样结果近似一样的情况 ,特别是int类型
d = gcd(k2*b1-k1*b2,k2-k1);
xy += (k2*b1-k1*b2)/d+ "/"+ (k2-k1)/d;
if(k1 != k2) {//如果有交点,k1 != k2把交点加入
points.add(xy);
}
}
count += (points.size()+1);//增加了交点数+1个部分
}
最后,完整的代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
List<Integer>ks = new ArrayList<>();//储存k值
List<Integer>bs = new ArrayList<>();//储存b值
int count = 1;//记录所分面数,没有直线时,count = 1;
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int k = 0, b = 0;
for(int i = 0; i < num; i++) {
boolean flag = true;
k = sc.nextInt();
b = sc.nextInt();
for(int j = 0; j < i; j++) {
if(ks.get(j) == k && bs.get(j) == b) {
i--;
num--;
flag = false;//判断当前直线是否已存在
//哈哈,不要想着用contains了,contains不能确保ks和bs是同一条直线的
break;
}
}
if(flag) {//不存在就加入
ks.add(k);
bs.add(b);
}
}
for(int i = 1; i < num; i++) {//从第一条直线开始,依次与前面的直线相交,增加面数 为交点数加1
Set<String>points = new HashSet<>();//记录交点
int k1 = ks.get(i);
int b1 = bs.get(i);
for(int j = 0; j < i; j++) {
int k2 = ks.get(j);
int b2 = bs.get(j);
int d = gcd(b1-b2, k2-k1); //化到最简式,以防出现(4/2,2/2)和(2/1,1/1)的情况;
String xy = (b1-b2)/d+ "/"+ (k2-k1)/d+",";//计算交点横坐标x,字符串表示,以防计算式不一样结果近似一样的情况 ,特别是int类型
d = gcd(k2*b1-k1*b2,k2-k1);
xy += (k2*b1-k1*b2)/d+ "/"+ (k2-k1)/d;
if(k1 != k2) {//如果有交点,k1 != k2把交点加入
points.add(xy);
}
}
count += (points.size()+1);//增加了交点数+1个部分
}
System.out.println(count);
sc.close();
}
public static int gcd(int a, int b) {
if(a==0 && b == 0)
return 1;
return b == 0 ? a : gcd(b , a % b);
}
}
如有不同意见,可以和在下交流讨论,嘻嘻