OSP 2011

Untuk soal 31, 32, dan 33
var
    i,j:integer;
    A: array[0..9,0..10] of integer;
    qr,qc: array[0..10000] of integer;
    mr: array[0..3] of integer = (0,1,0,-1);
    mc: array[0..3] of integer = (1,0,-1,0);
    area: array[0..9,0..10] of char =
    ( ('o','l','i','m','p','i','a','d','e','s','a'),
    ('i','n','s','t','i','n','g','k','a','t','p'),
    ('r','o','v','i','n','s','i','2','0','1','1'),
    ('.','i','o','i','2','0','1','1','d','i','a'),
    ('d','a','k','a','n','d','i','t','h','a','i'),
    ('l','a','n','d','.','g','o','g','e','t','g'),
    ('o','l','d','s','i','n','d','o','n','e','s'),
    ('i','a','.','b','e','p','r','e','p','a','r'),
    ('e','d','f','o','r','i','o','i','2','0','1'),
    ('1','.','i','n','d','o','n','e','s','i','a')
    );

procedure init;
var
    i:integer;
    j:integer;
begin
    for i:=0 to 9 do for j:=0 to 10 do A[i,j]:= 9999;
end;

procedure S_B;
var
    i,h,t: integer;
begin
    init;
    h:=0; t:=0;
    qr[t] := 2; qc[t] := 1;
    A[qr[t],qc[t]] := 0;
    t:=t+1;
    while (h<t) do
        begin
            begin
            for i:=0 to 3 do
            if ((0<=qr[h]+mr[i]) and (qr[h]+mr[i]<=9) and 
                (0<=qc[h]+mc[i]) and (qc[h]+mc[i]<=10)) and
{soal 33}       (area[qr[h]+mr[i],qc[h]+mc[i]] <> 'i') and
{soal 33}       (A[qr[h]+mr[i],qc[h]+mc[i]] > A[qr[h],qc[h]]) then
            begin
                qr[t] := qr[h]+mr[i];
                qc[t] := qc[h]+mc[i];
                A[qr[t],qc[t]] := A[qr[h],qc[h]]+1;
                t:=t+1;
            end;
        end;
        h:=h+1;
    end;
end;
  1. Setelah procedure S_B dipanggil, berapakah nilai A[0][10]? Jawab: ……..

  2. Berapakah nilai maksimum di antara semua nilai yang tersimpan pada matriks A? Jawab: ……..

  3. Jika baris 43 dan 44 diganti dengan
    (area[qr[h]+mr[i],qc[h]+mc[i]] <> 'i') then
    
    Berapakah nilai A[9][0] saat procedure S_B dipanggil? Jawab: ……..

    Isi area:
    olimpiadesa
    instingkatp
    rovinsi2011
    .ioi2011dia
    dakandithai
    land.gogetg
    oldsindones
    ia.beprepar
    edforioi201
    1.indonesia

    Ketika prosedur pertama dipanggil, program akan melakukan inisialisasi (init) dengan memberikan nilai 9999 ke semua isi array A. qr[0] dan qc[0] akan bernilai masing-masing 2 dan 1. Sehingga berikutnya A[2][1] menjadi 0 dan t menjadi 1. Karena sekarang h < t, maka kondisi perulangan akan terpenuhi.

    Kita harus mengetahui nilai qr[h] dan qc[h] serta mr (0,1,0,-1) dan mc(1,0,-1,0) karena akan tetap digunakan. qr[0] = 2 dan qc[0] = 1. Kondisi pertama dan kedua dalam if hanya memastikan bahwa nilai berada dalam jangkauan array 0-9 dan 0-10. Karena dilakukan perulangan dengan menggabungkan qr[h]+mr[i],qc[h]+mc[i], artinya program akan memeriksa sebelah kanan, bawah, kiri dan kanan dari area[qr[h],qc[h]].

    Karena salah satu kondisi untuk masuk if adalah (area[qr[h]+mr[i],qc[h]+mc[i]] <> 'i'), maka area yang merupakan ‘i’ tidak akan masuk if dan nilai A pada index yang sama tidak akan berubah menjadi A[qr[t],qc[t]] := A[qr[h],qc[h]]+1; dan tetap bernilai 9999. Karena nilai tersebut tetap 9999, maka ketika area menunjuk pada huruf i tidak akan dilakukan operasi karena syarat terakhir adalah (A[qr[h]+mr[i],qc[h]+mc[i]] > A[qr[h],qc[h]]) dan karena tidak ada nilai yang lebih besar dari 9999.

    qr[t] := qr[h]+mr[i];
    qc[t] := qc[h]+mc[i];
    
    Jika diperhatikan, qr dan qc akan menyimpan index sebelah kanan, bawah, kiri dan atas yang kemudian menjadi index berikutnya. Hal ini menandakan bahwa program melakukan bfs (breadth first search) pada array.
    Kemudian nilai pada index baru merupakan index yang sebelumnya ditunjuk + 1.
    A[qr[t],qc[t]] := A[qr[h],qc[h]]+1;
    

    Dengan demikian, setiap nilai pada array merupakan banyaknya langkah minimal yang dapat ditempuh dari titik awal (2,1) (kecuali titik dengan huruf i).

    [gfycat data_id="defenselessdimpledekaltadeta"]
  1. Jadi A[0][10] bernilai 15.

  2. Nilai maksimum yang ada adalah 9999.

  3. Jika syarat terakhir untuk if dihapus, maka program akan mengganti nilai tersebut terus menerus karena sebelumnya hanya mengganti array yang bernilai 9999 saja. Jika nilai terus berganti dan menjadi tidak konsisten. Oleh karena itu program juga bisa menyebabkan segmentation fault atau runtime error. Atau bisa saja karena program terus berjalan akan menyebabkan time limit exceeded

Share Now:

5 1 vote
Article Rating
Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
kim
kim
2 years ago

⅓ x ⅔ = 2/9 bagian
kok bisa gitu kak?

Langganan

Subscribe To Our Newsletter

2
0
Would love your thoughts, please comment.x
()
x

Follow TikTok Kami @cahinfor

Pembahasan soal tahun 2023 sudah tersedia di TikTok Kami loh!