Figure 1 shows Robbie’s new front yard. It was absolutely
beautiful in the springtime when he and his wife bought the house. That
continued into the summer, but then fall happened. The beautiful, mature trees
started dropping leaves! They dropped at such a rate that with a rake and leaf
blower, they could not keep up. After an entire afternoon of raking, the yard
was again covered in leaves within 24 hours.
After
multiple passive-aggressive fliers left on their door by lawn companies,
they’ve decided to reach out for help this year. David offered to help, but
none of us want to toil in vain. So, we’ve decided to create a high-tech
solution to the problem! Robot vacuums have been available for years, and
thankfully robot lawnmowers have recently started appearing in stores. To solve
our leaf problem and cash in on this trend, we would like to create a robot
leaf mulcher. However, as good product designers, we must first decide the best
width of robot mulcher based on yard dimensions and the layout of trees and
bushes. We would prefer to create the widest mulcher possible for Robbie’s
yard, allowing us to maximize battery life and minimize the amount of time the
mulcher must traverse the lawn.
Since
the trees and bushes in the yard appear to have been planted haphazardly many
years ago, we must take their unmovable positions into account. A mockup of the
lawn can be seen in Figure 2. Before we build
our first prototype robot mulcher, we need to know the maximum width such that
it will fit between any two trees in the yard, i.e. we need to determine
distance between the closest pair of tree or bush trunks (for simplicity,
disregard the leaves and branches around the base of the bushes).
Implement an
algorithm which takes as input the locations of the trees and bushes as
Cartesian coordinates, and returns the maximum width of the robot mulcher we
can use in the yard (i.e. the closest pair of trees). Your program should have
the following properties:
•
Your algorithm must be written in Python (2 or 3)
or Java (10).
•
You must download the appropriate wrapper code
from Collab based on the language you choose: main.py and closest_pair.py for
Python, Main.java and ClosestPair.java for
Java.
• The
compute() method in both Python and Java receives as input the body of the
input file as a list of lines. You must have main() return the distance between
the closest trees or bushes. An example input file is shown in Figure 3, which has answer ≈ 4.12311.
Note: the coordinates may be integers or
floating point numbers.
• You
should write another function in the closest_pair.py or ClosestPair.java file
to implement the Closest Pair algorithm. Your compute() method will then invoke
this function. Do not modify the
method definition for compute.
• You
should think about what intermediate representation you want to use to
represent the list of coordinates. You will probably prefer a different
representation than a list of strings. We suggest you write a helper method to
parse the input into your chosen representation.
•
Two additional test files are provided,
test1.txt and test2.txt, both with answer ≈
1.4142135623. You should produce additional tests,
including edge cases.
• You
may modify the Main.java or main.py files
to test your algorithm, but they will
not be used during grading.
• You
must submit your ClosestPair.java or closest_pair.py files on Collab. Do not zip them. Do not submit Main.java, main.py, or any
test files.
• A
few other notes:
–
Your code will be run as: python main.py or
python3 main.py for Python, or javac *.java && java Main for Java.
–
You may upload multiple Java files if you need
addional classes, but do not assign packages to the files
In the case that we discover our robot mulcher becomes the envy
of the neighborhood and super popular, and this whole “professor thing” doesn’t
work out for us, David and I may enter the robot mulcher business and mass
produce them for wider use. Therefore, we would like this algorithm to be very
efficient, so that we can quickly determine the appropriate size of mulcher for
any size lawn, even tree farms with thousands of trees! If we put in the
locations of thousands of trees and bushes, the algorithm should still run in a
reasonable amount of time. For this reason, an Ω(n2) algorithm
is too slow; to be efficient enough, your algorithm must run in O(n log n) time.
Get Free Quote!
363 Experts Online