Задача - обход конём шахматной доски
Две просьбы помощи, первая - выводить на экран обхода нет, если в массиве есть одинаковые элементы и второе - не хочет правильно выводить массив, если размерность не квадратная
Алгоритм:

program Project4;

{$APPTYPE CONSOLE}
const
size=100;

type
mas=array [1..size,1..size] of integer;
Horse=array [1..8] of integer;
var
brd,brd2:mas; i,j,k,l:integer; xn,yn,x0,y0,x1,y1,min,m,n:integer;
a,b,T:Horse; res:integer;

procedure step(var a,b:Horse); {Возможный шаг}
begin
a[1]:=1; b[1]:=2;
a[2]:=2; b[2]:=1;
a[3]:=-1; b[3]:=2;
a[4]:=2; b[4]:=-1;
a[5]:=-2; b[5]:=1;
a[6]:=1; b[6]:=-2;
a[7]:=-1; b[7]:=-2;
a[8]:=-2; b[8]:=-1;
end;



function CountStep(xn,yn:integer):integer; {Количество шагов}
var i :integer;
begin
result:=0;
for i:=1 to 8 do begin
if (((xn+a[i]) in [1..m])and((yn+b[i])in [1..n])and(brd[(xn+a[i]),(yn+b[i])]=0)) then begin
result:=result+1;
end;
end;
end;


{
Проверка возможности обхода
}
function isPossible:boolean;
begin
Result:=(((M*N) mod 2)=0) or (((x0+y0) mod 2)=0) and (x0>0) and (y0>0) and (x0<=m) and (y0<=n);
end;

procedure knght(x0,y0,m,n:integer;stp:integer; var brd:mas);
var i,j:integer;
begin
if stp=m*n-1 then begin
//writeln(x0,y0,stp);
if brd[x0,y0]=0 then
brd[x0,y0]:=stp;
//brd[x0,y0]:=stp;
end
else
begin
for i:=1 to 8 do begin
T[i]:=0;
end;

if stp<m*n then begin
if brd[x0,y0]=0 then begin
brd[x0,y0]:=stp;
end;

for i:=1 to 8 do begin
xn:=x0+a[i];
yn:=y0+b[i];
if (xn in [1..m])and(yn in [1..n])and(brd[xn,yn]=0) then begin
T[i]:=CountStep(xn,yn);
end;
end;
min:=1;

for i:=2 to 8 do begin

if ((T[min]>T[i])and(T[i]<>0))or((T[min]=0)and(T[i]<>0)) then begin
min:=i;
end;
end;
x1:=x0+a[min]; y1:=y0+b[min];
knght(x1,y1,m,n,stp+1,brd);
end
end;
end;


begin
res:=0;
step(a,cool.gif;
write('m=');readln(m);
write('n=');readln(n);
write('x0=');readln(x0);
write('y0=');readln(y0);
if IsPossible then begin
knght(x0,y0,m,n,1,brd);
for k:=1 to m do begin
for l:=1 to n do begin
while brd[k,l]=0 do brd[k,l]:=m*n;
if brd[k,l] div 10>=10 then begin
write(brd[k,l],' ');
end
else if (brd[k,l] div 10) in [1..9] then begin
write(brd[k,l],' ');
end
else if(brd[k,l] div 10)=0 then begin
write(brd[k,l],' ');
end;
if l=m then begin
writeln;
writeln;
end;
end;
end;
end
else
writeln ('obxoda net');
readln;
end.