蓝桥杯算法训练Balloons in a Box java(100%测例通过)

试题 算法训练 Balloons in a Box

你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球。
  接下来是模拟的方案。假设你已知一个长方体的盒子和一个点集。每一个点代表一个可以放置气球的位置。在一个点上放置一个气球,就是以这个点为球心,然后让这个球膨胀,直到触及盒子的边缘或者一个之前已经被放置好的气球。你不能使用一个在盒子外面或者在一个之前已经放置好的气球里面的点。但是,你可以按你喜欢的任意顺序使用这些点,而且你不需要每个点都用。你的目标是按照某种顺序在盒子里放置气球,使得气球占据的总体积最大。
  你要做的是计算盒子里没被气球占据的体积。
输入格式
  第一行包含一个整数n表示集合里点的个数(1≤n≤6)。第二行包含三个整数表示盒子的一个角落的(x,y,z)坐标,第三行包含与之相对的那个角落的(x,y,z)坐标。接下来n行,每行包含三个整数,表示集合中每个点的(x,y,z)坐标。这个盒子的每维的长度都是非零的,而且它的边与坐标轴平行。
输出格式
  只有一行,为那个盒子没被气球占据的最小体积(四舍五入到整数)。
样例输入
2
0 0 0
10 10 10
3 3 3
7 7 7
样例输出
774

思路

已知圆公式为:4/3 π r³,4/3π这一块是不变的,变的是 r³,所以转化问题成只需要求出最大的 r³ 即可,使用sums来表示最大的r³。
将一个点定义成一种结构体,有其坐标以及成为圆后的半径。
接下来就是无限dfs了:判断当前点使用或不使用的各个情况,累积各个情况的r³,取其中的最大值即可。

本题有几个坑:

1.坐标轴可能是负的,可能是正的,所以在进行判断的时候要两者都考虑
2.输入点并非全是在盒子内,有一些点是在盒外的,无法使用,所以我们定义一个 j 表示盒中的点的总数
3.点的不同顺序,会影响到 r³ 的值,比如我们现在有三个点,第一次我们生成圆的顺序是(点1 ,点2,点3),那可能第二次以(点2,点3,点1)的顺序得出的 r³ 会不同。针对这种情况我们使用交换(代码中的swap)点的坐标来进行各种情况的计算。第一次我使用123,第二次我交换点1和点2的坐标,则变成了 213,以此类推。
在这里插入图片描述

4.如果点在之前已经放置好的气球里面怎么办?这里就是为什么要使用sums来作为最大值的原因了。如果点在已经设置的圆内,那么它和圆点之间的距离必然是小于圆的半径,而我们使用的又是将半径重新定义成:

后点半径 = 点间距 - 前点半径在这里插入图片描述

此时后点半径会变成负的,而sum加上一个负数必然是小于原本的sum,所以在此时点在已经设置的圆内这种情况便会自动舍弃。

还有许多小细节也需要推敲,我都备注在代码里了

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BalloonsinaBox {
   
    public static class Node{
   
        int x,y,z;
        double banjin;
        public Node(int x, int y, int z) {
   
            this.x = x;
            this.y = y;
            this.z = z;
        }

        public Node getloc() {
   
            return new Node(x,y,z);
        }

        public void setloc(int x,int y,int z) {
   
            this.x = x;
            this.y=y;
            this.z=z;
        }

    }
    public static void swap(Node x,Node y){
   //交换点和点的位置
        Node z = x.getloc();
        x.setloc(y.x,y.y,y.z)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值