Что нового

Задачка (найти фрагменты из 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
Репутация
218
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 713
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
Репутация
218
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 713
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

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

:laugh:
 

dwerf

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

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
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
Репутация
218
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 713
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 713
Re: Задачка (найти фрагменты из 1-ниц на матрице с нолями).

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

:laugh:
 

Kalisnik

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

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

:laugh:
OffTopic:

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

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
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:
 
Верх