Имя пользователя:
Пароль:
 

Название темы: Двумерный массив
Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата vista54:
Iska, пример кода хотябы напиши) »
Держите:
читать дальше »
Код: Выделить весь код
Option Explicit

Const strStar       = "█"
Const strDot        = "░"
Const strFoundStar  = "◘"

Dim arrMatrix(3, 6)

Dim lngCount
Dim intTab

Dim i, j


FillRandom arrMatrix

DisplayArray arrMatrix

lngCount = 0
intTab = 0

For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
	For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
		If arrMatrix(i, j) = strStar Then
			lngCount = lngCount + 1
			
			'WScript.StdOut.WriteLine lngCount
			'WScript.StdOut.WriteLine String(UBound(arrMatrix, 2) + 1,"-")
			'DisplayArray arrMatrix
			'WScript.StdOut.WriteLine String(UBound(arrMatrix, 2) + 1,"-")
			
			Recurse i, j
		End If
	Next
	
	'WScript.StdOut.WriteLine
Next

WScript.StdOut.WriteLine
WScript.StdOut.WriteLine "Found " & lngCount & " continues of [" & strStar & "]."

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub Recurse(i, j)
	arrMatrix(i, j) = strFoundStar
	intTab = intTab + 1
	
	'DisplayArray arrMatrix
	
	If i - 1 >= LBound(arrMatrix, 1) Then
		If arrMatrix(i - 1, j) = strStar Then
			Recurse i - 1, j
		End If
	End If
	
	If j - 1 >= LBound(arrMatrix, 2) Then
		If arrMatrix(i, j - 1) = strStar Then
			Recurse i, j - 1
		End If
	End If
	
	If i + 1 <= UBound(arrMatrix, 1) Then
		If arrMatrix(i + 1, j) = strStar Then
			Recurse i + 1, j
		End If
	End If
	
	If j + 1 <= UBound(arrMatrix, 2) Then
		If arrMatrix(i, j + 1) = strStar Then
			Recurse i, j + 1
		End If
	End If
	
	intTab = intTab - 1
End Sub
'=============================================================================

'=============================================================================
Sub DisplayArray(arrMatrix())
	Dim i, j
	
	For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
		WScript.StdOut.Write Space(intTab * 4)
		
		For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
			WScript.StdOut.Write arrMatrix(i, j)
		Next
		
		WScript.StdOut.WriteLine
	Next
End Sub
'=============================================================================

'=============================================================================
Sub FillRandom(arrMatrix())
	Dim i, j
	
	Randomize Timer
	
	For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
		For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
			If Rnd() - 0.5 > 0 Then
				arrMatrix(i, j) = strStar
			Else
				arrMatrix(i, j) = strDot
			End If
		Next
	Next
End Sub
'=============================================================================
Один из возможных результатов…
Код: Выделить весь код
░█░██░░
░█░█░██
██░░██░
█░░█░░█

Found 5 continues of [█].

Это скрипт на WSH, исполнение только под консолью; перевод за Вами . Если хотите посмотреть шаги:
читать дальше »
Код: Выделить весь код
░█░██░░
░█░█░██
██░░██░
█░░█░░█
1
-------
░█░██░░
░█░█░██
██░░██░
█░░█░░█
-------
    ░◘░██░░
    ░█░█░██
    ██░░██░
    █░░█░░█
        ░◘░██░░
        ░◘░█░██
        ██░░██░
        █░░█░░█
            ░◘░██░░
            ░◘░█░██
            █◘░░██░
            █░░█░░█
                ░◘░██░░
                ░◘░█░██
                ◘◘░░██░
                █░░█░░█
                    ░◘░██░░
                    ░◘░█░██
                    ◘◘░░██░
                    ◘░░█░░█
2
-------
░◘░██░░
░◘░█░██
◘◘░░██░
◘░░█░░█
-------
    ░◘░◘█░░
    ░◘░█░██
    ◘◘░░██░
    ◘░░█░░█
        ░◘░◘█░░
        ░◘░◘░██
        ◘◘░░██░
        ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░██
        ◘◘░░██░
        ◘░░█░░█

3
-------
░◘░◘◘░░
░◘░◘░██
◘◘░░██░
◘░░█░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘█
    ◘◘░░██░
    ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░◘█
        ◘◘░░█◘░
        ◘░░█░░█
            ░◘░◘◘░░
            ░◘░◘░◘█
            ◘◘░░◘◘░
            ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░◘◘
        ◘◘░░◘◘░
        ◘░░█░░█


4
-------
░◘░◘◘░░
░◘░◘░◘◘
◘◘░░◘◘░
◘░░█░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘◘
    ◘◘░░◘◘░
    ◘░░◘░░█
5
-------
░◘░◘◘░░
░◘░◘░◘◘
◘◘░░◘◘░
◘░░◘░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘◘
    ◘◘░░◘◘░
    ◘░░◘░░◘


Found 5 continues of [█].

— раскомментируйте закомментированный вывод.

Алгоритм простой — движемся по массиву сверху вниз/слева направо. Найдя элемент с потребным содержимым, увеличиваем счётчик найденного и меняем содержимое элемента (дабы не учитывать его повторно), затем опрашиваем его «соседей» сверху, снизу, справа и слева. Если «сосед» также окажется элементом с потребным содержимым — вызываем аналогичную процедуру для него. Повторяем, пока не дойдём до конца массива.

P.S. Можно увидеть, что алгоритм не совсем оптимален — для «соседа» всегда будет проверяться его элемент-«сосед», с которого и «пришли» к данному элементу. Этого можно избежать, указывая дополнительно, с какого направления мы «пришли» к данному элементу. Но я не стал усложнять алгоритм, поскольку в данном случае сие малосущественно.

Последний раз редактировалось Iska, 11-05-2013 в 19:56. Причина: Подумал и добавил описание

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:31, 11-05-2013 | #9

Название темы: Двумерный массив