program AttraversaPalude;
const
R = 5;
C = 7;
MaxLunghezzaCammino = 35;
type
TipoRiga = 1..R;
TipoColonna = 1..C;
TipoIndiceCammino = 1..MaxLunghezzaCammino;
TipoPosizione = record
riga : TipoRiga;
colonna : TipoColonna
end;
TipoPalude = array [TipoRiga, TipoColonna] of 0..1;
TipoCammino = record
lunghezza : 0..MaxLunghezzaCammino;
posizioni : array [TipoIndiceCammino] of TipoPosizione
end;
procedure EsploraPalude (palude : TipoPalude;
var trovato : boolean;
var cammino : TipoCammino);
var
ri : integer;
procedure CercaCammino (i: TipoRiga; j: TipoColonna);
begin
if palude[i,j] = 1 then
begin
cammino.lunghezza := cammino.lunghezza + 1;
with cammino.posizioni[cammino.lunghezza] do
begin
riga := i;
colonna := j
end;
palude[i,j] := 0;
if j >= C then
trovato := TRUE
else
begin
if i > 1 then
CercaCammino(i-1, j+1);
if (not trovato) then
CercaCammino(i, j+1);
if (not trovato) and (i < R) then
CercaCammino(i+1, j+1);
if j > 2 then
begin
if (not trovato) and (i > 1) then
CercaCammino(i-1, j);
if (not trovato) and (i < R) then
CercaCammino(i+1, j);
if (not trovato) and (i > 1) then
CercaCammino(i-1, j-1);
if (not trovato) then
CercaCammino(i, j-1);
if (not trovato) and (i < R) then
CercaCammino(i+1, j-1);
end;
if not trovato then
cammino.lunghezza := cammino.lunghezza - 1
end
end
end;
begin
trovato := FALSE;
cammino.lunghezza := 0;
ri := 1;
while (not trovato) and (ri <= R) do
begin
CercaCammino(ri, 1);
ri := ri + 1
end;
end;
procedure StampaCammino (cammino: TipoCammino);
var
posizione : 0..MaxLunghezzaCammino;
begin
writeln('Cammino che attraversa la palude:');
for posizione := 1 to cammino.lunghezza do
with cammino.posizioni[posizione] do
writeln('<', riga, ',', colonna, '>')
end;
procedure LeggiPalude (var pal: TipoPalude);
var
nome_file : string;
file_matrice : text;
riga : TipoRiga;
colonna : TipoColonna;
begin
writeln('Nome del file contenente la rappresentazione della palude ?');
readln(nome_file);
assign(file_matrice, nome_file);
reset(file_matrice);
for riga := 1 to R do
for colonna := 1 to C do
read(file_matrice, pal[riga,colonna]);
close(file_matrice)
end;
procedure StampaPalude (pal: TipoPalude);
var
riga : TipoRiga;
colonna : TipoColonna;
begin
for riga := 1 to R do
begin
for colonna := 1 to C do
write(pal[riga,colonna],' ');
writeln
end
end;
var
pal : TipoPalude;
camm : TipoCammino;
trov : boolean;
begin
LeggiPalude(pal);
writeln('Palude:');
writeln;
StampaPalude(pal);
EsploraPalude(pal, trov, camm);
if trov then
StampaCammino(camm)
else
writeln('Non ci sono cammini che attraversano la palude')
end.