#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. Может кто-нибудь помочь мне в этом, пожалуйста