public Shape(int index, OneSidedShape oneSidedShape, int size) { _size = size; Index = index; OneSidedShape = oneSidedShape; Color = GetRandomColor(); }
private (bool canCut, (OneSidedShape, OneSidedShape) resultShapes) CutShape(bool[,] matrix, int n, int gapX, int gapY, int gapHeight) { var leftResult = new List <Point>(); var rightResult = new List <Point>(); var leftPointsToCheck = new Queue <Point>(); var rightPointsToCheck = new Queue <Point>(); if (gapY > 0) // one below { if (matrix[gapX, gapY - 1]) { leftPointsToCheck.Enqueue(new Point(gapX, gapY - 1)); } if (matrix[gapX + 1, gapY - 1]) { rightPointsToCheck.Enqueue(new Point(gapX + 1, gapY - 1)); } } if (gapY + gapHeight < n) // one above { if (matrix[gapX, gapY + gapHeight]) { leftPointsToCheck.Enqueue(new Point(gapX, gapY + gapHeight)); } if (matrix[gapX + 1, gapY + gapHeight]) { rightPointsToCheck.Enqueue(new Point(gapX + 1, gapY + gapHeight)); } } for (int i = gapY; i < gapY + gapHeight; i++) // next to { if (gapX > 0 && matrix[gapX - 1, i]) { leftPointsToCheck.Enqueue(new Point(gapX - 1, i)); } if (gapX < n - 2 && matrix[gapX + 2, i]) { rightPointsToCheck.Enqueue(new Point(gapX + 2, i)); } leftResult.Add(new Point(gapX, i)); rightResult.Add(new Point(gapX + 1, i)); } ExpandShape(matrix, n, leftPointsToCheck, leftResult); ExpandShape(matrix, n, rightPointsToCheck, rightResult); if (leftResult.Count + rightResult.Count != n) { return(false, (null, null)); } return(true, (OneSidedShape.FromListOfPoints(leftResult, n), OneSidedShape.FromListOfPoints(rightResult, n))); }