还是并查集的问题,不过里面判断两条线段是否相交,这是个难点。不过这对于我们学JAVA的来说,小说一桩了。
自己查下 API 里面有个类: Line2D ,是不是很牛叉。。。。。
package hdu;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @description HDU 1558
* @technique 并查集
* @date 20120814
* @time 11:28
* @version 1.0
* @author Alex
*/
public class Hdu1558_20120814_0 {
private static int [] set = new int[1001];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int count,n,i,size,j;
double x1,y1,x2,y2;
ArrayList<Line2D> list = new ArrayList<Line2D>();
count = in.nextInt();
String cms;
int cmi, res;
for(j = 0; j < count; ++j){
if(j!=0){
System.out.println();
}
n = in.nextInt();
init(n);
int n1 = n;
while(n1-->0){
cms = in.next();
if(cms.charAt(0) == 'P'){
x1 = in.nextDouble(); y1 = in.nextDouble();
x2 = in.nextDouble(); y2 = in.nextDouble();
list.add(new Line2D.Double(x1,y1,x2,y2));
size = list.size();
for(i = 0; i < size; ++i){
if(list.get(size-1).intersectsLine(list.get(i))){
meger(i+1,size);
}
}
}else{
cmi = in.nextInt();
res = 0;
for(i = 1; i <= n; ++i){
if(findx(i) == findx(cmi)){
++res;
}
}
System.out.println(res);
}
}
// show(n);
list.clear();
}
}
private static void init(int n){
for(int i = 1; i <= n; ++i){
set[i] = i;
}
}
private static void meger(int x, int y){
int fx = findx(x);
int fy = findx(y);
if(fx<fy){
set[fy] = fx;
}else{
set[fx] = fy;
}
}
private static int findx(int x){
if(set[x]!= x){
set[x] = findx(set[x]);
}
return set[x];
}
private static void show(int n){
for(int i = 1; i <= n; ++i){
System.out.print(set[i] + " ");
}
System.out.println();
}
}