Listing MARTE.PAS
Program
Marte;
const MaxMN=100;
Var t:array[1..MaxMN,1..MaxMN] of 0..2;
m,n:Word;
rezolvare:Word;
Procedure Citire;
var fi:Text; i,j:Word;
begin
Assign(fi,'MARTE.IN'); Reset(fi);
Readln(fi,m,n);
for i:=1 to m do
begin
for j:=1 to n do Read(fi,t[i,j]);
Readln(fi)
end;
Close(fi)
end;
Procedure
Scrie_rezultate;
var fo:Text;
begin
Assign(fo,'MARTE.OUT'); Rewrite(fo);
Writeln(fo,rezolvare); Close(fo)
end;
Procedure Calculeaza;
var i,j:Word;
e11,emn:array[1..MaxMN,1..MaxMN]
of Boolean;
begin
e11[1,1]:=true;
for i:=2 to m do
e11[i,1]:=e11[i-1,1] and (t[i,1]<>2);
for j:=2 to n do
e11[1,j]:=e11[1,j-1] and (t[1,j]<>2);
for i:=2 to m do
for j:=2 to n do
e11[i,j]:=(t[i,j]<>2) and (e11[i,j-1]
or e11[i-1,j]);
emn[m,n]:=true;
for i:=m-1 downto 1 do
emn[i,n]:=emn[i+1,n] and (t[i,n]<>2);
for j:=n-1 downto 1 do
emn[m,j]:=emn[m,j+1] and (t[m,j]<>2);
for i:=m-1 downto 1 do
for j:=n-1 downto 1 do
emn[i,j]:=(t[i,j]<>2) and (emn[i,j+1]
or emn[i+1,j]);
rezolvare:=0;
for i:=1 to m do
for j:=1 to n do
if e11[i,j] and emn[i,j] and (t[i,j]=1)
then Inc(rezolvare)
end;
Begin
Citire;
Calculeaza;
Scrie_rezultate
End.