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.