<?
// Считать первую непустую строку.
function get_not_empty_string($file_handle)
{
while(!feof($file_handle))
{
$s = fgets($file_handle);
if(trim($s))
return $s;
}
return "";
}
$fh=fopen("data.txt","rt");
for(;;)
{
// Считываем строку и разбиваем на три числа, отделённых пробелами
list($l,$r,$c) = preg_split("/\s+/", get_not_empty_string($fh));
// Выход, если три нуля или конец файла
if($l==0 && $r==0 && $c==0 || feof($fh))
break;
// Сброс начальных данных
$start=0;
$exit=0;
$empty=array();
// Считываем очередной блок данных
for($z=0; $z<$l; $z++)
{
for($y=0; $y<$r; $y++)
{
$row = get_not_empty_string($fh);
for($x=0; $x<$c; $x++)
{
$char = $row[$x];
if($char=="S")
$start=array($x,$y,$z);
if($char=="E")
$exit=array($x,$y,$z);
$empty[$z][$y][$x] = ($char=="#") ? 0 : 1;
}
}
}
// Создаём пустой массив путей
$array=array();
// Вычисляем путь
wave($exit[0],$exit[1],$exit[2]);
// Для демонстрации печатаем карту пути
for($z=0; $z<$l; $z++)
{
echo "\n";
for($y=0; $y<$r; $y++)
{
for($x=0; $x<$c; $x++)
{
$char=$array[$z][$y][$x];
echo $char ? ($char<10?$char:chr(ord('A')+$char-10)) : ".";
}
echo "\n";
}
}
// Печатаем время
$time=$array[$start[2]][$start[1]][$start[0]]-1;
echo $time>0?"$time минут\n":"Ловушка!\n";
}
function wave($x,$y,$z,$n=1)
{
global $array, $empty, $l, $r, $c;
// $array - волновой массив
// $empty - массив препятствий
// x/y/z - координаты тестируемой точки
// l/r/c - размеры лабиринта
// $n = уровень этой точки
// Если вышли за пределы лабиринта - ничего не делаем
if($x<0 || $x>=$c || $y<0 || $y>=$r || $z<0 || $z>=$l)
return;
// Если клетка занята, то ничего не делаем
if(!$empty[$z][$y][$x])
return;
// Если клетку уже проверяли и путь более оптимальный, то опять ничего не делаем.
if($array[$z][$y][$x] && $array[$z][$y][$x]<$n)
return;
// установим тестируемую клетку в нужный уровень
$array[$z][$y][$x]=$n;
// Новый уровень
$n++;
// Установим пустые соседние клетки
// Проверяем в лоб, так экономичнее
wave($x-1,$y,$z,$n);
wave($x+1,$y,$z,$n);
wave($x,$y-1,$z,$n);
wave($x,$y+1,$z,$n);
wave($x,$y,$z-1,$n);
wave($x,$y,$z+1,$n);
}
<font size="-2" color="#808080">[b]?[/b]>