Pembahasan Soal Lacak

Soal ini merupakan graph traversal BFS (Breadth Firsh Search) Khusus untuk masalah ini BFS dapat diimplementasikan tanpa menggunakan queue untuk menyimpan pencabangannya (breadthnya).

Idenya, dari suatu titik dan arah, kita mendapatkan sejumlah titik berikutnya sebagai breadth dalam BFS. Karena ukuran matrix 50x50 maka untuk kasus terburuk akan ada 49x49=2401 titik dalam breadth. Karena searching space sangat terbatas maka breadth tidak akan mengalami "peledakan".

Jadi kita menggunakan array breadth yang setiap elemennya menyimpan koordinat titik pencabangan. Dalam inisialisasi array hanya berisi satu titik yaitu posisi awal mobil.

Dalam setiap sinyal arah yang dibaca maka dari setiap titik dalam array breadth ini kita temukan kembali semua kemungkinan titik berikutnya di dalam peta dan menandainya. Setelah hal tersebut dilakukan untuk semua titik dalam breadth maka titik-titik pada peta yang telah ditandai dicatat ke dalam array breadth.

Hal tersebut dilakukan untuk setiap masukah yang dibaca dan setelah masukan arah terakhir maka tanda-tanda pada peta menyatakan semupa kemungkinan posisi mobil terakhir.

Dalam implementasinya kita perlu definisikan type posisi berikut.

type 
    posisi = record r, c: integer end;
Breadth adalah array dari elemen bertype posisi ini.

Selanjutnya kita perlu prosedur untuk memindahkan posisi bertanda "*" ke dalam array breadth.

    nb := 0;
    for i := 1 to nrow do
        for j := 1 to ncol do
            if peta[i,j] = '*' then begin
                inc(nb);
                breadth[nb].r := i; 
                breadth[nb].c := j;
                peta[i,j] := '.'; { clearkan posisi tsb}
            end;
Lalu untuk setiap titik breadth[b] dilakukan penandaan kembali posisi selanjutnya sesuai dengan arah yang diberikan. Misalnya untuk arah EAST maka
posNext := breadth[b];
inc(posNext.c);
while Jalan(posNext) do begin
    peta[posNext.r,posNext.c] := '*';
    inc(posNext.c);
end;
Untuk arah NORTH maka lakukan dengan
posNext := breadth[b];
dec(posNext.r);
while Jalan(posNext) do begin
    peta[posNext.r,posNext.c] := '*';
    dec(posNext.r);
end;

Untuk arah-arah lain diserahkan pada anda untuk melengkapi. Juga anda seharusnya dapat membuat fungsi Jalan(posNext) untuk memeriksa apakah pada posisi tersebut adalah jalan atau bukan.

function Jalan(posNext: posisi): boolean;
begin
    ....
    { kalau keluar peta maka false }
    { kalau tembok maka false }
    { kalau tidak maka true }
    ....
end;
Setelah semua titik pada breadth diproses maka breadh dikosongkan kembali dan diisi oleh titik-titik pada peta yang bertanda "*" kembali (dengan memanggil procedure di paling atas).

Setelah arah masukan terakhir maka peta langsung dituliskan sebagai keluaran.gampang khan???

Sebagai contoh, perhatikan peta masukan berikut ini

..........
.X.X..XXX.
.X..X.....
.X..X.....
....X.....
*......XX.
..........
breadth hanya berisi 1 titik, yaitu (6.1). Jika kemudian masukan arah adalah EAST maka breadth kemudian akan berisi titik-titik di samping kanan tanda bintang yaitu posisi-posisi kosong sampai ketemu tembok. Sekarang peta menjadi sbb.
..........
.X.X..XXX.
.X..X.....
.X..X.....
....X.....
.******XX.
..........
breadth hanya berisi 6 titik, yaitu (6.2), (6,3),...,(6,7). Jika kemudian masukan adalah NORTH maka hal seperti di atas dilakukan ke arah atas untuk masing-masing tanda bintang. Dan peta menjadi sbb.
..*..*....
.X*X.*XXX.
.X**X**...
.X**X**...
.***X**...
.......XX.
..........
Jika kemudian masukan adalah WEST maka hal seperti di atas dilakukan ke arah atas untuk masing-masing tanda bintang. Dan peta menjadi sbb.
*****.....
.X.X*.XXX.
.X*.X*....
.X*.X*....
***.X*....
.......XX.
..........
Jika kemudian masukan adalah NORTH maka hal seperti di atas dilakukan ke arah atas untuk masing-masing tanda bintang. Dan peta menjadi sbb.
*.*.**....
*X*X.*XXX.
*X*.X*....
*X*.X*....
....X.....
.......XX.
..........
Jika kemudian masukan adalah WEST maka hal seperti di atas dilakukan ke arah atas untuk masing-masing tanda bintang. Dan peta menjadi sbb.
*****.....
.X.X*.XXX.
.X..X.....
.X..X.....
....X.....
.......XX.
..........
Jika kemudian masukan adalah NORTH maka hal seperti di atas dilakukan ke arah atas untuk masing-masing tanda bintang. Dan peta menjadi sbb.
....*.....
.X.X..XXX.
.X..X.....
.X..X.....
....X.....
.......XX.
..........
Jika sinyal masukan sudah habis maka tanda-tanda bintang menyatakan semua kemungkinan mobil itu berada saat ini.