Cho một lưới ô vuông hình chữ nhật kích thước R, C. Có một con châu chấu ở một ô bất kì. Con châu chấu có thể đi theo hình L trên lưới (tương tự con mã trong cờ tướng). Cho vị trí con châu chấu R1, C1 và vị trí là cây R2, C2. Tìm đường đi ngắn nhất để con châu chấu đến được lá cây.

Mình đã thử làm bằng đệ qui quay lui có nhánh cận, nhưng thời gian thực hiện quá lâu. Mình đang tìm hiểu lý thuyết đồ thị, mà khi quay lui thì phải gọi hàm try(i, j: integer) có hai tham số. Mình muốn biểu diễn bằng đồ thị ý. tức xem mỗi ô là một đỉnh nhưng không biết làm thế nào. Mong các bạn chỉ giáo.

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.