my ($radky, $sloupce) = split " ", ; my $limit = ($radky+1) * ($sloupce+1); my @matice = (".") x ($sloupce + 1); for (1..$radky) { push @matice, ".", split(" ", ); } my ($start_r, $start_s) = split " ", ; my $start = $start_r*($sloupce+1) + $start_s; my @fronta; my %kroky; my %navstiveno; my $cil; push @fronta, $start; $kroky{$start} = 0; while (my $aktualni = pop @fronta) { $navstiveno{$aktualni} = 1; if ($matice[$aktualni] eq "D") { $cil = $aktualni; last; } for my $soused ($aktualni - $sloupce - 1, $aktualni + $sloupce + 1, $aktualni - 1, $aktualni + 1) { if ($soused > 0 and $soused < $limit) { next if $navstiveno{$soused}; next if $matice[$soused] eq "C"; next if $matice[$soused] eq "P"; push @fronta, $soused; $kroky{$soused} = $kroky{$aktualni} + 1 unless defined($kroky{$soused} and $kroky{$soused} < $kroky{$aktualni} + 1) } } } if ($cil != Undef) { print "Utéct se dá na ", $kroky{$cil}, " kroků.\n"; } else { print "Cesta neexistuje\n"; }