Mình đã làm được. Sử dụng BFS đối với ma trận.
Code cho những bạn quan tâm
const max = 100;
var a: array[-1..max + 2, -1..max + 2] of integer;
r, c, sr, sc, fr, fc: integer;
v: array[1..8] of integer = (-1, -2, -2, -1, 1, 2, 2, 1);
h: array[1..8] of integer = (-2, -1, 1, 2, 2, 1, -1, -2);
procedure IE; {enter and init}
var fi: text;
i, j: integer;
begin
assign(fi, 'data.inp'); reset(fi);
readln(fi, r, c, sr, sc, fr, fc); {r,c: kich thuoc luoi, sr, sc: vi tri chau chau (start), fr, fc: vi tri la cay (finish)}
close(fi);
fillword(a, sizeof(a) div sizeof(a[1][1]), -1);
for i := 1 to r do
for j := 1 to c do a[i][j] := 0;
end;
procedure BFS;
var qr, qc: array[1..max * max] of integer;
front, rear: integer;
row, col, k: integer;
begin
qr[1] := sr; qc[1] := sc;
front := 1; rear := 1;
repeat
row := qr[front]; col := qc[front]; inc(front);
for k := 1 to 8 do
if (a[row + v[k]][col + h[k]] = 0) and ((row + v[k] <> sr) or (col + h[k] <> sc)) then
begin
inc(rear);
qr[rear] := row + v[k];
qc[rear] := col + h[k];
a[row + v[k]][col + h[k]] := a[row][col] + 1;
end;
until front > rear;
end;
BEGIN
IE;
BFS;
if (a[fr][fc] = 0) then writeln('Impossible!!!')
else writeln('Result = ', a[fr][fc]);
END.