#!/usr/bin/perl
#!/usr/bin/perl
use strict;
use warnings;
my @I; # Исходная матрица
my @W; # Рабочая матрица
my ($MX,$MY); # Размеры матрицы
while(<DATA>) { # Читаем исходую матрицу
my @row=();
last if(!$_);
$MX=@row; $MY++; # Запоминаем размеры
my @row2=(); # И заполняем начальными значениями рабочую
push @row2,10000 for(1..$MX); }
$MX--; $MY--;
cell(0,1,0);
# Печать результирующей матрицы и расчет объема воды
my $summ=0;
my $y=0;
for(@W) {
$,=" ";
for my $x(0..$MX) { $summ+=$W[$y][$x]-$I[$y][$x]; }
$y++;
}
print "RESULT = $summ\n";
# Основная рабочая, рекурсивная функция
sub cell {
my($x, $y, $lev)=@_;
return if($x<0 || $y<0 || $x>$MX || $y>$MY); # Проверяем выход за пределы поля return if($W[$y][$x]<=$lev); # Максимум клетки ниже или равен - мы тут были if($lev < $I[$y][$x] || # Повышаем текущий уровень, если ниже изначального для клетки
($x==0 || $y==0 || $x==$MX || $y==$MY) # Или если выше, но это граничная клетка
) {
$lev=$I[$y][$x]
}
$W[$y][$x]=$lev; # Устанавливаем текущий максимум
cell($x-1,$y,$lev); # И обходим всех 4х соседей рекурсивно
cell($x+1,$y,$lev);
cell($x,$y-1,$lev);
cell($x,$y+1,$lev);
}
__DATA__
5 3 4 5
6 2 1 4
3 1 1 4
8 5 5 3
8 3 1 6
8 4 5 8
IyEvdXNyL2Jpbi9wZXJsCiMhL3Vzci9iaW4vcGVybAp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpteSBASTsgICAgICAgICMg0JjRgdGF0L7QtNC90LDRjyDQvNCw0YLRgNC40YbQsApteSBAVzsgICAgICAgICMg0KDQsNCx0L7Rh9Cw0Y8g0LzQsNGC0YDQuNGG0LAKbXkgKCRNWCwkTVkpOyAjINCg0LDQt9C80LXRgNGLINC80LDRgtGA0LjRhtGLCndoaWxlKDxEQVRBPikgeyAgIyDQp9C40YLQsNC10Lwg0LjRgdGF0L7QtNGD0Y4g0LzQsNGC0YDQuNGG0YMKICBteSBAcm93PSgpOwogIGNob21wOwogIGxhc3QgaWYoISRfKTsKICBwdXNoIEByb3csICRfIGZvciBzcGxpdCAvICsvOwogIHB1c2ggQEksIFxAcm93OwogICRNWD1Acm93OyAkTVkrKzsgICMg0JfQsNC/0L7QvNC40L3QsNC10Lwg0YDQsNC30LzQtdGA0YsKICBteSBAcm93Mj0oKTsgICAgICAjINCYINC30LDQv9C+0LvQvdGP0LXQvCDQvdCw0YfQsNC70YzQvdGL0LzQuCDQt9C90LDRh9C10L3QuNGP0LzQuCDRgNCw0LHQvtGH0YPRjgogIHB1c2ggQHJvdzIsMTAwMDAgZm9yKDEuLiRNWCk7CiAgcHVzaCBAVywgXEByb3cyOwp9CiRNWC0tOyAkTVktLTsKCmNlbGwoMCwxLDApOwoKIyDQn9C10YfQsNGC0Ywg0YDQtdC30YPQu9GM0YLQuNGA0YPRjtGJ0LXQuSDQvNCw0YLRgNC40YbRiyDQuCDRgNCw0YHRh9C10YIg0L7QsdGK0LXQvNCwINCy0L7QtNGLCm15ICRzdW1tPTA7Cm15ICR5PTA7CmZvcihAVykgewogICQsPSIgIjsKICBwcmludCAiQCRfXG4iOwogIGZvciBteSAkeCgwLi4kTVgpIHsgJHN1bW0rPSRXWyR5XVskeF0tJElbJHldWyR4XTsgfQogICR5Kys7Cn0KCnByaW50ICJSRVNVTFQgPSAkc3VtbVxuIjsKCiMg0J7RgdC90L7QstC90LDRjyDRgNCw0LHQvtGH0LDRjywg0YDQtdC60YPRgNGB0LjQstC90LDRjyDRhNGD0L3QutGG0LjRjwpzdWIgY2VsbCB7CiAgbXkoJHgsICR5LCAkbGV2KT1AXzsKICByZXR1cm4gaWYoJHg8MCB8fCAkeTwwIHx8ICR4PiRNWCB8fCAkeT4kTVkpOyAgIyDQn9GA0L7QstC10YDRj9C10Lwg0LLRi9GF0L7QtCDQt9CwINC/0YDQtdC00LXQu9GLINC/0L7Qu9GPCiAgcmV0dXJuIGlmKCRXWyR5XVskeF08PSRsZXYpOyAgICAjINCc0LDQutGB0LjQvNGD0Lwg0LrQu9C10YLQutC4INC90LjQttC1INC40LvQuCDRgNCw0LLQtdC9IC0g0LzRiyDRgtGD0YIg0LHRi9C70LgKICBpZigkbGV2IDwgJElbJHldWyR4XSB8fCAgICAjINCf0L7QstGL0YjQsNC10Lwg0YLQtdC60YPRidC40Lkg0YPRgNC+0LLQtdC90YwsINC10YHQu9C4INC90LjQttC1INC40LfQvdCw0YfQsNC70YzQvdC+0LPQviDQtNC70Y8g0LrQu9C10YLQutC4CiAgICAgKCR4PT0wIHx8ICR5PT0wIHx8ICR4PT0kTVggfHwgJHk9PSRNWSkgIyDQmNC70Lgg0LXRgdC70Lgg0LLRi9GI0LUsINC90L4g0Y3RgtC+INCz0YDQsNC90LjRh9C90LDRjyDQutC70LXRgtC60LAKICAgICkgewogICAgJGxldj0kSVskeV1bJHhdCiAgfQogICRXWyR5XVskeF09JGxldjsgICAgIyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRgtC10LrRg9GJ0LjQuSDQvNCw0LrRgdC40LzRg9C8CiAgY2VsbCgkeC0xLCR5LCRsZXYpOyAjINCYINC+0LHRhdC+0LTQuNC8INCy0YHQtdGFIDTRhSDRgdC+0YHQtdC00LXQuSDRgNC10LrRg9GA0YHQuNCy0L3QvgogIGNlbGwoJHgrMSwkeSwkbGV2KTsKICBjZWxsKCR4LCR5LTEsJGxldik7CiAgY2VsbCgkeCwkeSsxLCRsZXYpOwp9CgpfX0RBVEFfXwo1IDMgNCA1CjYgMiAxIDQKMyAxIDEgNAo4IDUgNSAzCjggMyAxIDYKOCA0IDUgOAo=