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;
-
Setelah
procedure S_B
dipanggil, berapakah nilaiA[0][10]
? Jawab: …….. -
Berapakah nilai maksimum di antara semua nilai yang tersimpan pada matriks A? Jawab: ……..
-
Jika baris 43 dan 44 diganti dengan
(area[qr[h]+mr[i],qc[h]+mc[i]] <> 'i') then
Berapakah nilaiA[9][0]
saat procedureS_B
dipanggil? Jawab: ……..
-
Isi area:
-
Jadi
A[0][10]
bernilai 15. -
Nilai maksimum yang ada adalah 9999.
-
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 menyebabkantime limit exceeded
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"]
⅓ x ⅔ = 2/9 bagian
kok bisa gitu kak?
Kan ibunya dapat 1/3, jadi sisa 2/3 untuk anak-anaknya. Karena anaknya ada 3, jadi 2/3 itu dibagi 3 lagi buat masing-masing anak, sehingga bagian yang didapat anak-anaknya itu 1/3 dari 2/3 = 2/9.