#!/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--;
# обходим все 4 стороны прямоугольника
cell(0,$_,0) for(1..$MY);
cell($MX,$_,0) for(1..$MY);
cell($_,0,0) for(1..$MX);
cell($_,$MY,0) for(1..$MX);
# Печать результирующей матрицы и расчет объема воды
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); # Максимум клетки ниже или равен - мы тут были $lev=$I[$y][$x] if($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+0LvQvdGP0LXQvCDQvdCw0YfQsNC70YzQvdGL0LzQuCDQt9C90LDRh9C10L3QuNGP0LzQuCDRgNCw0LHQvtGH0YPRjgogIHB1c2ggQHJvdzIsMTAwMDAgZm9yKDEuLiRNWCk7CiAgcHVzaCBAVywgXEByb3cyOwp9CiRNWC0tOyAkTVktLTsKIyDQvtCx0YXQvtC00LjQvCDQstGB0LUgNCDRgdGC0L7RgNC+0L3RiyDQv9GA0Y/QvNC+0YPQs9C+0LvRjNC90LjQutCwCmNlbGwoMCwkXywwKSAgIGZvcigxLi4kTVkpOwpjZWxsKCRNWCwkXywwKSBmb3IoMS4uJE1ZKTsKY2VsbCgkXywwLDApICAgZm9yKDEuLiRNWCk7CmNlbGwoJF8sJE1ZLDApIGZvcigxLi4kTVgpOwoKIyDQn9C10YfQsNGC0Ywg0YDQtdC30YPQu9GM0YLQuNGA0YPRjtGJ0LXQuSDQvNCw0YLRgNC40YbRiyDQuCDRgNCw0YHRh9C10YIg0L7QsdGK0LXQvNCwINCy0L7QtNGLCm15ICRzdW1tPTA7Cm15ICR5PTA7CmZvcihAVykgewogICQsPSIgIjsKICBwcmludCAiQCRfXG4iOwogIGZvciBteSAkeCgwLi4kTVgpIHsgJHN1bW0rPSRXWyR5XVskeF0tJElbJHldWyR4XTsgfQogICR5Kys7Cn0KCnByaW50ICJSRVNVTFQgPSAkc3VtbVxuIjsKCiMg0J7RgdC90L7QstC90LDRjyDRgNCw0LHQvtGH0LDRjywg0YDQtdC60YPRgNGB0LjQstC90LDRjyDRhNGD0L3QutGG0LjRjwpzdWIgY2VsbCB7CiAgbXkoJHgsICR5LCAkbGV2KT1AXzsKICByZXR1cm4gaWYoJHg8MCB8fCAkeTwwIHx8ICR4PiRNWCB8fCAkeT4kTVkpOyAgIyDQn9GA0L7QstC10YDRj9C10Lwg0LLRi9GF0L7QtCDQt9CwINC/0YDQtdC00LXQu9GLINC/0L7Qu9GPCiAgcmV0dXJuIGlmKCRXWyR5XVskeF08PSRsZXYpOyAgICAjINCc0LDQutGB0LjQvNGD0Lwg0LrQu9C10YLQutC4INC90LjQttC1INC40LvQuCDRgNCw0LLQtdC9IC0g0LzRiyDRgtGD0YIg0LHRi9C70LgKICAkbGV2PSRJWyR5XVskeF0gaWYoJGxldiA8ICRJWyR5XVskeF0pOyAgIyDQn9C+0LLRi9GI0LDQtdC8INGC0LXQutGD0YnQuNC5INGD0YDQvtCy0LXQvdGMLCDQtdGB0LvQuCDQvdC40LbQtSDQuNC30L3QsNGH0LDQu9GM0L3QvtCz0L4g0LTQu9GPINC60LvQtdGC0LrQuAogICRXWyR5XVskeF09JGxldjsgICAgIyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRgtC10LrRg9GJ0LjQuSDQvNCw0LrRgdC40LzRg9C8CiAgY2VsbCgkeC0xLCR5LCRsZXYpOyAjINCYINC+0LHRhdC+0LTQuNC8INCy0YHQtdGFIDTRhSDRgdC+0YHQtdC00LXQuSDRgNC10LrRg9GA0YHQuNCy0L3QvgogIGNlbGwoJHgrMSwkeSwkbGV2KTsKICBjZWxsKCR4LCR5LTEsJGxldik7CiAgY2VsbCgkeCwkeSsxLCRsZXYpOwp9CgpfX0RBVEFfXwo1IDMgNCA1CjYgMiAxIDQKMyAxIDEgNAo4IDUgNSAzCjggMyAxIDYKOCA0IDUgOAo=