Почему-то когда ввожу это:
101
000
101
прога выдаёт «3» и при др. случаях тоже иногда выдаёт неправильный результат. Почему? Помогите пожалуйста, а то над прогой уже несколько дней сижу!
Условия задачи: Каждый элемент квадратной матрицы размеренности N x N равен нулю, либо единице. Найдите количество «островов», образованных единицами. Под «островом» понимается группа единиц (либо одна единица), со всех сторон окруженная нулями (или краями матрицы). Единицы относятся к одному «острову», если из одной из них можно перейти к другой «наступая» на единицы, расположенные в соседних клетках. Соседними являются клетки, граничащие по горизонтали или вертикали.
#!/usr/bin/perl
sub zero;
@sea = map{[split//]}<>; # ввод и создание двумерного массива
$count = 0;
for $y(0..$#sea){ # обход всех элементов
for $x(0..$#{$sea[$y]}){
if($sea[$y]->[$x] eq "1"){ # если найдена "1", то обнулить весь отсров
$count++;
zero $x, $y, \@sea;
}
}
}
print "$count\n";
sub zero{ # рекурсивное обнуление строва
my $x = $_[0], $y = $_[1], $sea = $_[2];
if(!$sea->[$y][$x] || $x < 0 || $y < 0 || $y > $#{$sea} || $x > $#{$sea->[$y]}){
return;
}
$sea->[$y][$x] = 0;
zero $x+1, $y, $sea;
zero $x-1, $y, $sea;
zero $x, $y+1, $sea;
zero $x, $y-1, $sea;
}
P.S. И вообще хотелось бы услышать как можно улучшить (упростить) код.