public bool CanStackAbove(Box bottomBox)
 {
     if (bottomBox == null || bottomBox == this) {
         return false;
     }
     return this.Height <= bottomBox.Height
         && this.Width <= bottomBox.Width
         && this.Depth <= bottomBox.Depth;
 }
 static List<Box> GetStackWithHighestHeight(List<Box> boxes, Box bottom, Dictionary<Box, List<Box>> dict)
 {
     if (bottom != null && dict.ContainsKey (bottom)) {
         return dict [bottom];
     }
     List<Box> maxStack = new List<Box> ();
     int maxStackHeight = 0;
     foreach (var box in boxes.Where(b => b != bottom || bottom==null)) {
         if (box.CanStackAbove (bottom)) {
             var tempStack = GetStackWithHighestHeight (boxes, box, dict);
             int tempHeight = GetHeightOfStack (tempStack);
             if (tempHeight > maxStackHeight) {
                 maxStack = tempStack;
                 maxStackHeight = tempHeight;
             }
         }
     }
     if (bottom != null) {
         maxStack.Add (bottom);
     }
     dict.Add(bottom, maxStack);
     return new List<Box>(maxStack);
 }