Raindrop on Sidewalk
Description
Model raindrops falling on a sidewalk (sidewalk is 1m and raindrops are 1cm). How could we know when the sidewalk is completely wet.
OR
you have 1 meter sidewalk, and randomly generate rain, the rain is 1 cm. simulate how many rain drops to cover all the 1 meter [-0.01~1].
Source: https://www.1point3acres.com/bbs/thread-176388-1-1.html
Solution
TreeSet Approach
Not sure why, but seems hard to converge (cover).
public class RaindropSidewalk {
private TreeSet<double[]> sidewalk = new TreeSet<>(new Comparator<double[]>() {
@Override
public int compare(double[] a, double[] b) {
return Double.compare(a[0], b[0]);
}
});
public void addRainDrop(double center) {
double[] range = new double[] {center - 0.5, center + 0.5};
double[] left = sidewalk.floor(range);
if (left != null && left[1] > range[0]) {
range[0] = left[0];
sidewalk.remove(left);
}
double[] right = sidewalk.ceiling(range);
if (right != null && right[0] < range[1]) {
range[1] = right[1];
sidewalk.remove(right);
}
sidewalk.add(range);
}
public boolean isCovered() {
if (sidewalk.size() == 1) {
if (sidewalk.first()[0] <= 0 && sidewalk.first()[1] >= 100) {
return true;
}
}
return false;
}
public void printSideWalk() {
System.out.println("--" + sidewalk.size());
for (double[] rain: sidewalk) {
System.out.println("::" + Arrays.toString(rain));
}
}
public void print() {
System.out.println("size ::" + sidewalk.size());
}
public static void main(String[] args) {
Random rand = new Random();
RaindropSidewalk s = new RaindropSidewalk();
int count = 0;
for (int rain = 0; rain <= 100; rain++) {
s.addRainDrop(rain);
s.printSideWalk();
}
/*
while (!s.isCovered()) {
double rain = (double)rand.nextInt(101) + rand.nextDouble();
s.addRainDrop(rain);
count++;
if (count % 1e5 == 0) {
s.print();
}
if (count % 1e7 == 0) {
s.printSideWalk();
}
if (count > 1e9) {
break;
}
}
System.out.println("count: " + count);
*/
}
}Interval Approach
https://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=176388&extra=&page=1
Another Interval approach
Reference
http://massivealgorithms.blogspot.com/2016/06/simulate-rain-in-1-meter-side-walk.html
Last updated
Was this helpful?