private bool IsIntersects(List <MatrixBorder> borders, MatrixBorder testBorder) { foreach (var bord in borders) { if (bord.Intersect(testBorder)) { return(true); } } return(false); }
//Самый очевидный способ. Брут форс. Просто перебираем все возможные прямоугольники, исключаем пересечения, сортируем и выдаем результат //Время выполнения O(N**4) private List <MatrixBorder> FindAllOneRectangles(CellObject[,] grid) { List <MatrixBorder> borders = new List <MatrixBorder>(); int rows = grid.GetUpperBound(0) + 1; int columns = grid.GetUpperBound(1) + 1; for (int rowLower = 0; rowLower < rows; rowLower++) { for (int colLower = 0; colLower < columns; colLower++) { for (int rowUpper = rowLower; rowUpper < rows; rowUpper++) { for (int colUpper = colLower; colUpper < columns; colUpper++) { MatrixBorder border = new MatrixBorder { minRow = rowLower, maxRow = rowUpper, minColumn = colLower, maxColumn = colUpper }; if (border.IsAllNonZeros(grid) && border.area > 0) { borders.Add(border); } } } } } borders.Sort((a, b) => { return(b.area.CompareTo(a.area)); }); List <MatrixBorder> result = new List <MatrixBorder>(); if (borders.Count > 0) { result.Add(borders[0]); } for (int i = 1; i < borders.Count; i++) { if (!IsIntersects(result, borders[i])) { result.Add(borders[i]); } } return(result); }
private bool IsEqual(MatrixBorder other) { return((minRow == other.minRow) && (maxRow == other.maxRow) && (minColumn == other.minColumn) && (maxColumn == other.maxColumn)); }
public bool Intersect(MatrixBorder other) { return((minColumn <= other.maxColumn && maxColumn >= other.minColumn && minRow <= other.maxRow && maxRow >= other.minRow) || IsEqual(other)); //return (maxColumn < other.minColumn || other.maxColumn < minColumn || maxRow < other.minRow || other.maxRow < minRow); }