|
@@ -111,6 +111,49 @@ public class BrickStack
|
|
|
return count;
|
|
return count;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public long CountAllFalling()
|
|
|
|
|
+ {
|
|
|
|
|
+ var supports = new Dictionary<Brick, List<Brick>>();
|
|
|
|
|
+ var isSupportedBy = new Dictionary<Brick, List<Brick>>();
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var b in _bricks.OrderBy(x => x.MinZ))
|
|
|
|
|
+ {
|
|
|
|
|
+ supports.TryAdd(b, new List<Brick>());
|
|
|
|
|
+ isSupportedBy.TryAdd(b, new List<Brick>());
|
|
|
|
|
+ foreach (var above in BricksAbove(b))
|
|
|
|
|
+ {
|
|
|
|
|
+ supports[b].Add(above);
|
|
|
|
|
+
|
|
|
|
|
+ isSupportedBy.TryAdd(above, new List<Brick>());
|
|
|
|
|
+ isSupportedBy[above].Add(b);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var count = 0L;
|
|
|
|
|
+ foreach (var b in _bricks.OrderBy(x => x.MinZ))
|
|
|
|
|
+ {
|
|
|
|
|
+ // walk "up" the graph to all nodes that only have supports within our "set" starting with the current brick
|
|
|
|
|
+ var set = new HashSet<Brick>();
|
|
|
|
|
+ var edge = new List<Brick> { b };
|
|
|
|
|
+ while (edge.Count > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ foreach (var e in edge)
|
|
|
|
|
+ {
|
|
|
|
|
+ set.Add(e);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ edge = edge.SelectMany(e => supports[e])
|
|
|
|
|
+ .Distinct()
|
|
|
|
|
+ .Where(above => isSupportedBy[above].Count(below => !set.Contains(below)) == 0)
|
|
|
|
|
+ .ToList();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ count += set.Count - 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return count;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private Vec Min(params Vec[] vectors)
|
|
private Vec Min(params Vec[] vectors)
|
|
|
{
|
|
{
|
|
|
var x = vectors[0].X;
|
|
var x = vectors[0].X;
|