蓝桥杯校内赛5--气泡包含问题

蓝桥杯校内赛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]);

		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值