Пример #1
0
 private bool IsIntersects(List <MatrixBorder> borders, MatrixBorder testBorder)
 {
     foreach (var bord in borders)
     {
         if (bord.Intersect(testBorder))
         {
             return(true);
         }
     }
     return(false);
 }
Пример #2
0
    //Самый очевидный способ. Брут форс. Просто перебираем все возможные прямоугольники, исключаем пересечения, сортируем и выдаем результат
    //Время выполнения 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);
    }
Пример #3
0
 private bool IsEqual(MatrixBorder other)
 {
     return((minRow == other.minRow) && (maxRow == other.maxRow) && (minColumn == other.minColumn) && (maxColumn == other.maxColumn));
 }
Пример #4
0
 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);
 }