Как найти самый низкий заполненный массив [самый низкий заполненный] сверху вниз [равномерно распределенный как можно больше]

#vb.net #fill #flood-fill

Вопрос:

Это очень трудно объяснить, поэтому я поместил картинку, чтобы объяснить это, в основном это похоже на алгоритм заливки, но для двумерных многомерных массивов. Начните с левого верхнего угла и закончите справа внизу. Выводится наименьшее пустое значение (не окрашенное на изображении). Чтобы возиться с заполнениями при отладке, установите биты в массиве заполненных битов. для тестирования.

пример

 'Lowest populated array [lowest filled in].
Dim LowestFilledColumn As Integer = Integer.MaxValue
Dim LowestFilledRow As Integer = Integer.MaxValue

For Row = 0 To Uniques.Length - 1
    For Column = 0 To Uniques(Row).Length - 1
        If Row <= LowestFilledRow AndAlso Column <= LowestFilledColumn AndAlso FilledBits(Row)(Column) = 0 Then
            LowestFilledRow = Row
            LowestFilledColumn = Column
        End If
    Next
Next
 

также попробовал это

 'Lowest populated array [lowest filled in].
Dim LowestFilledColumn As Integer = Integer.MaxValue
Dim LowestFilledRow As Integer = Integer.MaxValue

For Row = Uniques.Length - 1 To 0 Step -1
    For Column = Uniques(Row).Length - 1 To 0 Step -1
        If Row <= LowestFilledRow AndAlso Column <= LowestFilledColumn AndAlso FilledBits(Row)(Column) = 0 Then
            LowestFilledRow = Row
            LowestFilledColumn = Column
        End If
    Next
Next
 

также попробовал это, что очень близко к тому, что мне нужно, но я не могу настроить его под свои предпочтения [Поиск по ширине]

 Dim LowestRowBFS As Integer = Integer.MaxValue
Dim LowestColumnBFS As Integer = Integer.MaxValue
Dim foundLowestBFS As Boolean = False
Dim queue As Queue = New Queue()

queue.Enqueue("0,3")

While queue.Count() > 0

    Dim x As String = queue.Dequeue()
    Row = x.Split(",")(0)
    Column = x.Split(",")(1)

    If Row < 0 OrElse Column < 0 OrElse Row >= Uniques.Length OrElse Column >= Uniques(Row).Length OrElse FilledBits(Row)(Column) = 1 Then Continue While

    Console.WriteLine("output = " amp; Uniques(Row)(Column) amp; " row:[" amp; Row amp; "] column:[" amp; Column amp; "]")
    FilledBits(Row)(Column) = 1

    queue.Enqueue(Row amp; "," amp; (Column - 1)) 'go left
    queue.Enqueue(Row amp; "," amp; (Column   1)) 'go right
    queue.Enqueue((Row - 1) amp; "," amp; Column) 'go up
    queue.Enqueue((Row   1) amp; "," amp; Column) 'go down
End While

If foundLowestBFS AndAlso LowestRowBFS = Integer.MaxValue Then
    LowestRowBFS = Row
    LowestColumnBFS = Column
End If
 

Here is the demo test code

 AddUniqueValueNoFilledBits(Uniques, 0, 1)
AddUniqueValueNoFilledBits(Uniques, 0, 2)
AddUniqueValueNoFilledBits(Uniques, 0, 4)
AddUniqueValueNoFilledBits(Uniques, 0, 3)
AddUniqueValueNoFilledBits(Uniques, 1, 1)
AddUniqueValueNoFilledBits(Uniques, 1, 2)
AddUniqueValueNoFilledBits(Uniques, 1, 3)
AddUniqueValueNoFilledBits(Uniques, 1, 4)
AddUniqueValueNoFilledBits(Uniques, 2, 3)
AddUniqueValueNoFilledBits(Uniques, 2, 2)
AddUniqueValueNoFilledBits(Uniques, 2, 1)
AddUniqueValueNoFilledBits(Uniques, 3, 8)
AddUniqueValueNoFilledBits(Uniques, 3, 2)
AddUniqueValueNoFilledBits(Uniques, 3, 1)
AddUniqueValueNoFilledBits(Uniques, 4, 2)
AddUniqueValueNoFilledBits(Uniques, 5, 2)
 
 Public Uniques()() As Byte
Public FilledBits()() As Byte


Public Sub AddUniqueValueNoFilledBits(ByRef Uniques()() As Byte, Row As Integer, Value As Byte)
    'Resize array if not existing.
    If Uniques Is Nothing Then
        ReDim Uniques(0)
        ReDim Preserve Uniques(Row)
        Uniques(Row) = New Byte() {}
    End If

    'Re-size array if needed.
    If Uniques.Length <= Row Then
        ReDim Preserve Uniques(Row)
        Uniques(Row) = New Byte() {}
    End If

    'Add new number to this row
    Dim TotalColumnsInRow As Integer = Uniques(Row).Length
    ReDim Preserve Uniques(Row)(TotalColumnsInRow)
    Uniques(Row)(TotalColumnsInRow) = Value

    'Resize array if not existing.
    If FilledBits Is Nothing Then
        ReDim FilledBits(0)
        ReDim Preserve FilledBits(Row)
        FilledBits(Row) = New Byte() {}
    End If

    'Re-size array if needed.
    If FilledBits.Length <= Row Then
        ReDim Preserve FilledBits(Row)
        FilledBits(Row) = New Byte() {}
    End If


    'Set Filled Bit Flag to 1
    TotalColumnsInRow = FilledBits(Row).Length
    ReDim Preserve FilledBits(Row)(TotalColumnsInRow)
    'FilledBits(Row)(TotalColumnsInRow) = 1
End Sub
 

Комментарии:

1. Что мне нужно, так это что-то вроде поиска по ширине, который я могу настроить и запустить с любым смещением, чтобы получить следующее значение.

2. Может кто-нибудь помочь мне в этом, пожалуйста