Что нового

Задачка (найти фрагменты из 1-ниц на матрице, заполненной нулями и единицами).

beve

Осваивающий
Сообщения
104
Репутация
30
Имеется задачка с интернета:
Код:
Имеется матрица (n*m) заполненная 1 и 0. Единицы - это острова, а нули - море. Если единицы находятся рядом по горизонтали или вертикали - то они образуют один остров. Найти количество островов.
P.S. Естественно могут быть "гнутые" и "дырявые" острова.
Хочется найти самое оптимальное решение (чисто в познавательных целях - изучаю рекурсивные функции.)
Идея ясна, так как есть описание на форумах в интернете, идем от начала массива и если встречаем на пути 1-ницу, то заменяем ее на ноль, и дальше делаем просчет по 4 координатам и так до конца "острова"- результат заносим в счетчик и так продолжаем далее.
Для большей нагладности, начало может быть таким:
Код:
#include <array.au3>

Dim $aArray[6][6] =[ _
 [ 1, 0, 1, 0, 0, 1 ], _
 [ 0, 1, 1, 0, 1, 0 ], _
 [ 1, 0, 0, 0, 1, 1 ], _
 [ 1, 1, 1, 0, 0, 1 ], _
 [ 1, 0, 0, 1, 0, 1 ], _
 [ 1, 1, 0, 1, 1, 0 ]]
 
 _ArrayDisplay($aArray)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Задачка, на создание рекурсии (найти фрагменты из 1-ниц на матрице с нолями).

Получилось так, алгоритм немного другой:
Код:
Dim $aArray[6][6] =[ _
 [ 1, 0, 1, 0, 0, 1 ], _
 [ 0, 1, 1, 0, 1, 0 ], _
 [ 1, 0, 0, 0, 1, 1 ], _
 [ 1, 1, 1, 0, 0, 1 ], _
 [ 1, 0, 0, 1, 0, 1 ], _
 [ 1, 1, 0, 1, 1, 0 ]]

 $iCounter = 0
 $iStatus = 0

For $iY = 0 To 5 Step +1
	For $iX = 0 To 5 Step +1
		If $aArray[$iY][$iX] = 1 Then ;если остров
			If $iStatus < 2 Then ;если не (заблокирован, так как уже подсчитан)
				If Execute('$aArray[$iY-1][$iX]') = 1 Then ;если по тем же координатам, но на ряд выше, значит уже подсчитан
					$iStatus = 2 ;блокируем
				Else ;ещё не подсчитан
					$iStatus = 1 ;нашли часть острова, отметили, смотрим дальше вправо
				EndIf
			EndIf
		Else ;если море
			If $iStatus = 1 Then $iCounter += 1 ;если нашли остров, сверху подсчитанных кусков острова не оказалось, а море началось, значит добавляем 1
			$iStatus = 0 ;сброс
		EndIf
	Next
	If $iStatus = 1 Then $iCounter += 1 ;если нашли остров, сверху подсчитанных кусков острова не оказалось, а ряд кончился и справа ничего больше нет, значит добавляем 1
	$iStatus = 0 ;сброс
Next

MsgBox(0, '', $iCounter)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Задачка, на создание рекурсии (найти фрагменты из 1-ниц на матрице с нолями).

Графическое решение. Есть в API такая функция ExtFloodFill(), которая закрашивает заданным цветом все соединяющиеся области указанного цвета. Аналогично Paint Bucket Tool в Adobe Photoshop.

Алгоритм:

  • Рисуем матрицу в виде черных (острова) и белых (море) точек.
  • Сканируем все пространство и при обнаружении острова закрашиваем его с помощью этой функции в цвет моря и увеличиваем счетчик.
  • И так до конца.

Алгоритм будет занимать всего несколько строк, но для наглядности...

Код:
#Include <WinAPIEx.au3>

Dim $aArray[6][6] =[ _
	[ 1, 0, 1, 0, 0, 1 ], _
	[ 0, 1, 1, 0, 1, 0 ], _
	[ 1, 0, 0, 0, 1, 1 ], _
	[ 1, 1, 1, 0, 0, 1 ], _
	[ 1, 0, 0, 1, 0, 1 ], _
	[ 1, 1, 0, 1, 1, 0 ]]

$hForm = GUICreate('Острова: 0', 240, 240)
GUISetBkColor(0x94DBFF)
GUISetState()

Sleep(500)

$hDC = _WinAPI_GetDC($hForm)
_WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_BRUSH))
_WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_PEN))
_WinAPI_SetDCBrushColor($hDC, 0x00A13D)
_WinAPI_SetDCPenColor($hDC, 0x00A13D)
For $y = 0 To 5
	For $x = 0 To 5
		If $aArray[$y][$x] Then
			$tRect = _WinAPI_CreateRectEx($x * 40, $y * 40, 40, 40)
			_WinAPI_Rectangle($hDC, $tRect)
		EndIf
	Next
Next

Sleep(1000)

; Подсчитываем острова
$Count = 0
For $y = 0 To 240 Step 40
	For $x = 0 To 240 Step 40
		If _WinAPI_GetPixel($hDC, $x, $y) = 0x00A13D Then
			$Count += 1
			WinSetTitle($hForm, '', 'Острова: ' & $Count)
			_WinAPI_SetDCBrushColor($hDC, 0x00A2FF)
			_WinAPI_ExtFloodFill($hDC, $x, $y, 0x94DBFF)
			Sleep(250)
			_WinAPI_SetDCBrushColor($hDC, 0x94DBFF)
			_WinAPI_ExtFloodFill($hDC, $x, $y, 0x94DBFF)
			Sleep(1000)
		EndIf
	Next
Next

GUICtrlCreateLabel('The End', 98, 113, 44, 14)

Do
Until GUIGetMsg() = -3
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Спасибо за код и объяснения.
Yashied - спасибо за наглядный интересный пример.

P.S. Я совсем по другому думал - в этом и ошибка моя. Я размышляю, как должен работать алгоритм для игры "Балда" - нужна рекурсия, или же тоже можно обойтись циклами? Потом нашел в инете эту задачку, которую я выходит изначально не так пытался решить.
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

dwerf, а как в этом случае быть?
Код:
#cs 
Dim $aArray[6][6] =[ _
    [ 1, 0, 1, 0, 0, 1 ], _
    [ 0, 1, 1, 0, 1, 0 ], _
    [ 1, 0, 0, 0, 1, 1 ], _
    [ 1, 1, 1, 0, 0, 1 ], _
    [ 1, 0, 0, 1, 0, 1 ], _
    [ 1, 1, 0, 1, 1, 0 ]]
#ce

Dim $aArray[2][3] =[ _
    [1, 0, 1], _
    [1, 1, 1]]

$iCounter = 0
 $iStatus = 0

For $iY = 0 To ubound($aArray)-1 Step +1
    For $iX = 0 To ubound($aArray,2)-1 Step +1
        If $aArray[$iY][$iX] = 1 Then ;если остров
            If $iStatus < 2 Then ;если не (заблокирован, так как уже подсчитан)
                If Execute('$aArray[$iY-1][$iX]') = 1 Then ;если по тем же координатам, но на ряд выше, значит уже подсчитан
                    $iStatus = 2 ;блокируем
                Else ;ещё не подсчитан
                    $iStatus = 1 ;нашли часть острова, отметили, смотрим дальше вправо
                EndIf
            EndIf
        Else ;если море
            If $iStatus = 1 Then $iCounter += 1 ;если нашли остров, сверху подсчитанных кусков острова не оказалось, а море началось, значит добавляем 1
            $iStatus = 0 ;сброс
        EndIf
    Next
    If $iStatus = 1 Then $iCounter += 1 ;если нашли остров, сверху подсчитанных кусков острова не оказалось, а ряд кончился и справа ничего больше нет, значит добавляем 1
    $iStatus = 0 ;сброс
Next

MsgBox(0, '', $iCounter)
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

beve [?]
а как в этом случае быть?

Для маленьких матриц нужно по логике решать:

2x2 - максимум один остров

2х3 -
If $aArray[0][1]=0 And $aArray[1][1]=0 Then
;два острова
Else
;один остров
EndIf

3х2 -
If $aArray[1][0]=0 And $aArray[1][1]=0 Then
;два острова
Else
;один остров
EndIf

3х3(и больше) - здесь уже можно применять алгоритм, так как кол-во клеток >= 9
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Sp01LeR [?]
Для маленьких матриц нужно по логике решать
Думаю, так как размер матрицы может быть не ясен изначально, то обрабатывать есть суть по одному алгоритму...
Мой акцент не на маленькой матрице, а на случае, когда "острова" будут выстроенны таким способом, что их связь идет через нижние ячейки, а не через уже обработанный верхние. Вот интересно, что в этом случае делать, проверять все возможные от конкретной ячейки и до (по очереди обрабатывая) глубины вниз массива->налево->+1ячейку->и дальше вверх, до уже обработанной ячейки - нет ли связи - это не то. А как иначе тогда, исходя из варианта dwerf?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

beve [?]
а как в этом случае быть?

Думать лень.
На угад:

Код:
Dim $aArray[4][4] = [[1, 1, 0, 1], _
					 [1, 0, 1, 1], _
					 [1, 1, 1, 1], _
					 [0, 0, 0, 0]]

$iCounterA = 0
$iStatus  = 0

ConsoleWrite(@LF)

For $iY = 0 To UBound($aArray, 1)-1 Step +1
    For $iX = 0 To UBound($aArray, 2)-1 Step +1
        If $aArray[$iY][$iX] = 1 Then
            If $iStatus < 2 Then
                If Execute('$aArray[$iY-1][$iX]') = 1 Then
                    $iStatus = 2
                Else
                    $iStatus = 1
                EndIf
            EndIf
        Else
            If $iStatus = 1 Then $iCounterA += 1
            $iStatus = 0
        EndIf
		ConsoleWrite($iX & @TAB & $iY & @TAB & $aArray[$iY][$iX] & @TAB & $iStatus & @TAB & $iCounterA & @LF)
    Next
    If $iStatus = 1 Then $iCounterA += 1
    $iStatus = 0
Next

;~ MsgBox(0, '', $iCounterA)

$iCounterB = 0
$iStatus  = 0

ConsoleWrite(@LF)

For $iY = UBound($aArray, 1)-1 To 0 Step -1
    For $iX = UBound($aArray, 2)-1 To 0 Step -1
        If $aArray[$iY][$iX] = 1 Then
            If $iStatus < 2 Then
                If Execute('$aArray[$iY+1][$iX]') = 1 Then
                    $iStatus = 2
                Else
                    $iStatus = 1
                EndIf
            EndIf
        Else
            If $iStatus = 1 Then $iCounterB += 1
            $iStatus = 0
        EndIf
		ConsoleWrite($iX & @TAB & $iY & @TAB & $aArray[$iY][$iX] & @TAB & $iStatus & @TAB & $iCounterB & @LF)
    Next
    If $iStatus = 1 Then $iCounterB += 1
    $iStatus = 0
Next

;~ MsgBox(0, '', $iCounterB)

If $iCounterB < $iCounterA Then $iCounterA = $iCounterB
MsgBox(0, '', $iCounterA)
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Код dwerf очень лаконичен, но не совсем корректен. Если вот здесь вместо звездочки поставить единицу, то результат не изменится, хотя островов стало на один меньше:

Код:
Dim $aArray[6][6] =[ _
 [ 1, 0, 1, 0, 0, 1 ], _
 [ 0, 1, 1, 0, 1, 0 ], _
 [ 1, 0, *, 0, 1, 1 ], _
 [ 1, 1, 1, 0, 0, 1 ], _
 [ 1, 0, 0, 1, 0, 1 ], _
 [ 1, 1, 0, 1, 1, 0 ]]


Вот мой вариант, вроде работает при любых условиях... Единственный минус - он "монстр"... Страшный до ужаса и большой )))

Код:
#include <Array.au3>

Dim $aArray[6][6] =[ _    ;Обратите внимание! Для наглядности матрица другая, соответсвенно и результат будет иным.
 [ 1, 0, 1, 0, 1, 1 ], _
 [ 0, 1, 1, 0, 1, 0 ], _
 [ 1, 0, 0, 0, 1, 1 ], _
 [ 1, 1, 1, 1, 0, 1 ], _
 [ 1, 0, 0, 1, 0, 1 ], _
 [ 1, 1, 0, 1, 1, 1 ]]
 
Dim $Y, $X, $Max_Y, $Max_X, $Arr_Vids[36], $schet = 0, $schet_Vid, $Vid, $Sort, $Island

$Max_Y = 5 ;Не забываем указывать максимальное значение на единицу меньше.
$Max_X = 5


#comments-start
Dim $aArray[2][3] =[ _
    [1, 0, 1], _
    [1, 1, 1]]

$Max_Y = 1
$Max_X = 2
#comments-end



For $Y = 0 To $Max_Y
	For $X = 0 To $Max_X
		If $aArray[$Y][$X] = True Then
			$Arr_Vids[(($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 1] = ($Max_X + 1) * ($Y + 1) - ($Max_X - $X) ;Вот здесь я конечно намудрил!
			$schet -= 1
			If Execute("$aArray[$Y-1][$X]") = True Then ;Эту часть кода я "любезно" позаимствовал у dwerf (стырил).
				If $schet_Vid = False Then
					$schet_Vid = $Arr_Vids[(($Max_X + 1) * $Y - ($Max_X - $X)) - 1]
				ElseIf $schet_Vid < $Arr_Vids[(($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 1] Then ;...ну и здесь немного тоже намудрил. 
					$Vid = $Arr_Vids[(($Max_X + 1) * $Y - ($Max_X - $X)) - 1]
					For $i = 0 To UBound($Arr_Vids) - 1
						If $Arr_Vids[$i] = $Vid Then
							$Arr_Vids[$i] = $schet_Vid
						EndIf
					Next
				EndIf
			EndIf
			If $X = $Max_X Then
				If $schet < 0 Then
					For $i = (($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 1 To (($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) + $schet Step -1 ;В общем намудрил везде где только можно...
						If $schet_Vid = True Then
							$Arr_Vids[$i] = $schet_Vid
						Else
							$Arr_Vids[$i] = $Arr_Vids[(($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) + $schet]
						EndIf
					Next
				EndIf
				$schet = 0
				$schet_Vid = False
			EndIf
		Else
			If $schet < 0 Then
					For $i = (($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 2 To ((($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 1) + $schet Step -1
						If $schet_Vid = True Then
							$Arr_Vids[$i] = $schet_Vid
						Else
							$Arr_Vids[$i] = $Arr_Vids[((($Max_X + 1) * ($Y + 1) - ($Max_X - $X)) - 1) + $schet]
						EndIf
					Next
				EndIf
			$schet = 0
			$schet_Vid = False
		EndIf
	Next
Next

_ArraySort($Arr_Vids)
For $i = 0 To UBound($Arr_Vids) - 1 ;Сортируем массив и...
	If $Arr_Vids[$i] > $Sort Then
		$Sort = $Arr_Vids[$i]
		$Island += 1
	EndIf
Next

MsgBox(0, "Зомби-Матрица", "Количество Зомби-Островов:  " & $Island & " шт.") ;Вуаля! ))


Назвал я его "Зомби-Матрицой" 8) Потому что принцип работы таков:
Если на одном острове больше одной цифры, то одна из цифр начинает всех "кусать" и превращать всех в свою копию (ну помните агента Смита? :laugh:smile:, пока на острове не останется ни кого чужого. То же самое и на всех других островах. Когда же все будут перекусаны, то дело в шляпе. Строем их по порядку и счиаем количество Зомби-видов - именно оно и будет соотвествовать количеству островов. :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

А мой способ самый простой и меньше всего кода.

:laugh:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied сказал(а):
А мой способ самый простой и меньше всего кода.

:laugh:

OffTopic:
В WinApiEx.au3 больше 20000 строк :blum:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

beve сказал(а):
...изучаю рекурсивные функции.

Ну раз уж речь зашла о рекурсии, то вот вариант с ней (проще уже некуда):

Код:
Dim $aArray[6][6] = [ _
		[1, 0, 1, 0, 0, 1], _
		[0, 1, 1, 0, 1, 0], _
		[1, 0, 0, 0, 1, 1], _
		[1, 1, 1, 0, 0, 1], _
		[1, 0, 0, 1, 0, 1], _
		[1, 1, 0, 1, 1, 0]]

$Island = 0

For $y = 0 To UBound($aArray, 1) - 1
	For $x = 0 To UBound($aArray, 2) - 1
		If $aArray[$y][$x] Then
			_DrownIsland($aArray, $x, $y)
			$Island += 1
		EndIf
	Next
Next

ConsoleWrite('Островов: ' & $Island & @CR)

Func _DrownIsland(ByRef $aArray, $x, $y)
	$aArray[$y][$x] = 0
	If ($y > 0) And ($aArray[$y - 1][$x]) Then
		_DrownIsland($aArray, $x, $y - 1)
	EndIf
	If ($y < UBound($aArray, 1) - 1) And ($aArray[$y + 1][$x]) Then
		_DrownIsland($aArray, $x, $y + 1)
	EndIf
	If ($x > 0) And ($aArray[$y][$x - 1]) Then
		_DrownIsland($aArray, $x - 1, $y)
	EndIf
	If ($x < UBound($aArray, 2) - 1) And ($aArray[$y][$x + 1]) Then
		_DrownIsland($aArray, $x + 1, $y)
	EndIf
EndFunc   ;==>_DrownIsland
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied [?]
Ну раз уж речь зашла о рекурсии, то вот вариант с ней (проще уже некуда):

Меня туда же понесло:
Код:
Dim $aArray[4][4] = [[1, 0, 0, 1], _
					 [1, 0, 1, 1], _
					 [1, 1, 1, 1], _
					 [0, 0, 1, 0]]

$iCounter = 0

For $iY = 0 To UBound($aArray, 1)-1 Step +1
	For $iX = 0 To UBound($aArray, 2)-1 Step +1
		If $aArray[$iY][$iX] = 1 Then
			kill($iX, $iY)
			$iCounter += 1
		EndIf
	Next
Next

MsgBox(0, '', $iCounter)

Func kill($iX, $iY)
	$aArray[$iY][$iX] = 0
	If Execute('$aArray[$iY][$iX-1]') Then kill($iX-1, $iY)
	If Execute('$aArray[$iY][$iX+1]') Then kill($iX+1, $iY)
	If Execute('$aArray[$iY-1][$iX]') Then kill($iX, $iY-1)
	If Execute('$aArray[$iY+1][$iX]') Then kill($iX, $iY+1)
EndFunc
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

OffTopic:

dwerf
Yashied
Ну это совсем уж нечестно ;D
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Хе-хе. Kalisnik, в твоем коде 7(!!!) уровней вложений, что само за себя говорит о неправильном решении для такой простой задачки. Ты наверное потратил не один час на написание этого кода... А нужно было через полчаса остановиться и поискать другой путь.

:smile:
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied сказал(а):
Хе-хе. Kalisnik, в твоем коде 7(!!!) уровней вложений, что само за себя говорит о неправильном решении для такой простой задачки. Ты наверное потратил не один час на написание этого кода... А нужно было через полчаса остановиться и поискать другой путь.

:smile:

OffTopic:

Так и есть! )) Принципиально решил ее решить, хотя видимо опыта еще не хватает )). Спасибо за совет! :beer:
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied [?]
Ну раз уж речь зашла о рекурсии, то вот вариант с ней (проще уже некуда):
:ok: :ok: :ok:
Эврика!!! Вот что я хотел постичь изначально.
dwerf - аналогично.
Но это даже хорошо, что не сначала дан был такой ответ, очень интересное было для меня все это. Спасибо всем большое. Тема решена!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Надо бы усложнить задачку. Вместо островов будут астероиды в космосе (3D).

:laugh:
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied сказал(а):
Надо бы усложнить задачку. Вместо островов будут астероиды в космосе (3D).

:laugh:

OffTopic:

Нуж нет! На сегодня с меня хватит! :rofl:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

Yashied сказал(а):
Надо бы усложнить задачку. Вместо островов будут астероиды в космосе (3D).

Код:
Dim $aArray[3][3][3] = [[[1, 0, 1], _
						 [1, 1, 1], _
						 [0, 0, 0]], _
						[[0, 0, 0], _
						 [0, 0, 0], _
						 [0, 0, 0]], _
						[[0, 0, 0], _
						 [1, 1, 1], _
						 [1, 0, 1]]]

$iCounter = 0

For $iZ = 0 To UBound($aArray, 1)-1 Step +1
	For $iY = 0 To UBound($aArray, 2)-1 Step +1
		For $iX = 0 To UBound($aArray, 3)-1 Step +1
			If $aArray[$iZ][$iY][$iX] = 1 Then
				kill($iX, $iY, $iZ)
				$iCounter += 1
			EndIf
		Next
	Next
Next

MsgBox(0, '', $iCounter)

Func kill($iX, $iY, $iZ)
	$aArray[$iZ][$iY][$iX] = 0
	If Execute('$aArray[$iZ][$iY][$iX-1]') Then kill($iX-1, $iY, $iZ)
	If Execute('$aArray[$iZ][$iY][$iX+1]') Then kill($iX+1, $iY, $iZ)
	If Execute('$aArray[$iZ][$iY-1][$iX]') Then kill($iX, $iY-1, $iZ)
	If Execute('$aArray[$iZ][$iY+1][$iX]') Then kill($iX, $iY+1, $iZ)
	If Execute('$aArray[$iZ-1][$iY][$iX]') Then kill($iX, $iY, $iZ-1)
	If Execute('$aArray[$iZ+1][$iY][$iX]') Then kill($iX, $iY, $iZ+1)
EndFunc

Даёшь четырёхмерное пространство :smile:
 
Верх