蓝桥杯校内赛5
题目如下:
在数据可视化当中,我们会用气泡图来表示一些实体之间的包含关系,如下图:
若用树形的结构(父节点包含子节点)来表示的话,则可以构成一颗包含6个节点的树:
可以保证的是,若一个实体是另一个实体的子节点,则其在气泡图中的圆一定包含于其父节点的圆。
但现在的问题是粗心的小Ho弄丢了生成气泡图的原始数据,只留下了气泡图。他希望拜托你通过这个气泡图将其树形结构恢复。
输入
第1行:1个正整数N,1≤N≤1000,表示气泡图中圆的数量(编号1…N)
第2…N+1行:每行3个实数,xi,yi,ri,第i+1行表示编号为i实体所产生的圆坐标为(xi,yi),并且半径为ri
输出
N行:每行1个正整数,第i行表示编号为i的实体在树形结构中父节点的编号。若为根节点则输出0
分析:
大气泡包含小气泡的条件:1.大气泡半径大于小气泡
2.大气泡的上边界在小气泡上面,下边界在小气泡下面,左边界在小气泡左边,有边界在小气泡右边。(我们分别用x-r,x+r,y-r,y+r代表左右上下边界)。
1)先建立二维数组结构:
2)计算各个气泡的边界
3)按照半径排序
4)依次找出父节点
代码实现:
package com.john;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
class circle{
public int num;
public double x;
public double y;
public double r;
public double left;
public double right;
public double up;
public double down;
}
public circle addc(int num,double x,double y,double r) {
circle c = new circle();
c.num = num;
c.x = x;
c.y = y;
c.r = r;
c.left=x-r;
c.right=x+r;
c.down=y-r;
c.up=y+r;
return c;
}
public static void main(String[] args) {
Main m = new Main();
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
int []result = new int[n];
circle []c = new circle[n];
for(int i = 0;i<n;i++) {
double x = sc.nextDouble();
double y = sc.nextDouble();
double r = sc.nextDouble();
c[i]=m.addc(i+1,x,y,r);
}
Arrays.sort(c, new Comparator<circle>() {
@Override
public int compare(circle o1, circle o2) {
if(o1.r-o2.r>0)
return 1;
else if(o1.r-o2.r<0)
return -1;
else
return 0;
}
});
for(int i =0;i<n;i++) {
for(int j =i;j<n;j++) {
if(c[i].left>c[j].left&&c[i].right<c[j].right&&c[i].down>c[j].down&&c[i].up<c[j].up) {
result[c[i].num-1]=c[j].num;
break;
}
}
}
for(int i =0;i<n;i++)
System.out.println(result[i]);
}
}