OLIMPIADE NASIONAL INFORMATIKA

dokumen-dokumen yang mirip
a. TRUE b. FALSE c. Jawaban A dan B keduanya dimungkinkan benar d. Tidak dapat ditentukan e. Tidak ada jawaban di antara A, B, C, D yang benar

Algoritma,Flowchart, Konsep

MODUL PRAKTIKUM PERCABANGAN DAN PENGULANGAN

Indentifier, Keywords, Variable, Tipe Data dan Operator. Ramos Somya, S.Kom., M.Cs.

Belajar itu, Tidak harus menunggu materi dari guru Inisiatif Mencari itulah BELAJAR.

Algoritma Pemrograman

Teori Algoritma. Struktur Algoritma

Algoritma Pemrograman

Pertemuan 6 Array Objektif: 1. Memahami cara mendeklarasi tipe indeks dalam array 2. Dapat membuat program sederhana menggunakan array Pertemuan 6 53

Pengantar dalam Bahasa Pemrograman Turbo Pascal Tonny Hidayat, S.Kom

TIPE, NAMA, DAN NILAI

Pembahasan Soal Olimpiade Sains Nasional 2004 Bidang Informatika Pekanbaru, Agustus 2004

OLIMPIADE SAINS TERAPAN NASIONAL 2008

JENIS DATA SEDERHANA & INPUT/OUTPUT DATA

ARRAY. contoh : A[1] := 10; var A : array[1..10] of integer; A[nomer_indeks]

SOAL DAN JAWABAN UTS PEMROGRAMAN DASAR KELAS X

Algoritma Shell Sort Ascending Dan Binary Sequential Search Menggunakan C

Sesi/Perkuliahan ke: II

Algoritma Pemrograman

Modul Algoritma Dan Pemrograman Pascal

Chapter 3.2 : Tipe, Nama dan Nilai

Konstruksi Dasar Algoritma

I. KATA PENGANTAR. Modul Algoritma Pemrograman. Modul Ke-4 - Hal 1

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

Dasar Komputer & Pemrograman 2A

Algoritma dan Pemrograman. Loop control structures: WHILE. Loop control structures: WHILE Perhatikan potongan program berikut: 12/29/2011

Algoritma Pemrograman

PENGANTAR ALGORITMA DAN PEMROGRAMAN

Bab 2 DASAR-DASAR ALGORITMA

Algoritma Pemrograman

Algoritma Pemrograman

Algoritma Pemrograman

Tipe Data dan Operator dalam Pemrograman

PROSES PENJUALAN BUKU

KONSEP DASAR BAHASA PASCAL

JENIS-JENIS DATA DAN STATEMEN INPUT OUTPUT

Soal hari Jumat (16/10) Latihan 10 MS

Pengenalan Pascal. Sejarah Singkat Pascal

VARIABEL, TIPE DATA, KONSTANTA, OPERATOR DAN EKSPRESI. Pemrograman Dasar Kelas X Semester 2

Pertemuan 4 KONSEP TIPE DATA

STRUKTUR KENDALI. Memanfaatkan struktur kendali untuk kasus komputasi

ARRAY. Larik / array adalah tipe terstruktur yang terdiri dari sejumlah komponen-komponen yang mempunyai tipe yang sama.

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

MODUL PRAKTIKUM. MODUL I - VIII Modul penuntun dan bahan praktikum matakuliah algoritma dan pemograman

SOAL PASCAL A. 1. Lengkapi Source Code Dibawah ini : {* Program Menghitung dengan Operator Matematika*}

Konsep Sorting dalam Pemrograman Saniman dan Muhammad Fathoni

Penggunaan Algoritma Greedy untuk menyelesaikan Permainan Othello

Teori Algoritma TIPE DATA

Perulangan. Bentuk Proses. 1. Perulangan For positif contoh 1 : perulangan positif untuk satu statement :

ARRAY. Brigida Arie Minartiningtyas, M.Kom

Dasar Komputer & Pemrogaman 2A

PENGULANGAN Bagian 1 : Notasi. Tim Pengajar KU1071 Sem

STRUKTUR DASAR ALGORITMA

TPI4202 e-tp.ub.ac.id. Lecture 5

Strategi Algoritma Penyelesaian Puzzle Hanjie

P A S C A L D A S A R

BAB VII ALGORITMA DIVIDE AND CONQUER

ALGORITMA PERULANGAN

Algoritma Pemrograman

Pengantar dalam Bahasa Pemrograman Turbo Pascal

Variabel dan Tipe Data Kusrini 1, Heri Sismoro 2

Struktur Data. Belajar Struktur Data Menggunakan Pascal Pertemuan-1

FUNGSI. Blok fungsi juga diawali dengan kata cadangan Begin dan di akhiri dengan kata cadangan End dan titik koma.

PERKEMBANGAN PASCAL. Pascal adalah bahasa tingkat tinggi ( high level language) yang orientasinya pada segala tujuan

Bubble Sort (Pengurutan Gelembung / Pemberatan)

Algoritma HitungGajiKaryawan Deklarasi NIK,Nama,Jabatan : String Gaji, Tunj, Pajak, Gaber : Real

.::BAB II.::MENGENAL PASCAL

Pertemuan 4 Diagram Alur / Flowchart

SATUAN ACARA PERKULIAHAN (SAP) Mata Kuliah : Struktur Data Kode : TIS3213 Semester : III Waktu : 2 x 3 x 50 Menit Pertemuan : 14 & 15

Algoritma Pemrograman

Algoritma Pemrograman

BAB IV STRUKTUR PROGRAM Struktur program pada dasarnya tersusun 3 struktur program utama yaitu : a. Struktur Berurutan (Sequence Structure) b.

CCH1A4 / Dasar Algoritma & Pemrogramanan

procedure menu; forward; { *memperkenalkan procedure menu, yang dibuat dibawah utk dipanggil diatasnya* }

Perulangan Muh. Izzuddin Mahali, M.Cs. Pertemuan 3. Algoritma dan Struktur Data. PT. Elektronika FT UNY

& PEMROGRAMAN. Alex De Kweldju, S.Kom D3 Teknik Komputer Fakultas Teknik Universitas Negeri Papua

MODUL 1. Struktur Bahasa PASCAL secara umum

SUB PROGRAM : PROSEDUR & FUNGSI. Konsep Pemrograman

PENGANTAR LOGIKA DAN ALGORITMA DENGAN PASCAL

BAB III QUEUE (ANTRIAN)

Nama : Suseno Rudiansyah NPM : Kelas : X2T Prodi : Teknik Informatika Tugas : Kuis Algoritma 2

Soal hari Selasa (13/10) Latihan 7 AN

1. Kompetensi Mengenal dan memahami notasi-notasi algoritma yang ada.

Brigida Arie Minartiningtyas, M.Kom

Pertemuan Ke-2 (Teks Algoritma) Rahmady Liyantanto. S1 Teknik Informatika-Unijoyo

[Type the company name] [Type the document title] [Type the document subtitle] Gilang Abdul Aziz [Pick the date]

Chapter 5 Choice. repeatedly if tanda 2 on label: lakukan proses potong 2 if tanda 3 on label: lakukan proses potong 3 until switched off program 5.

Pemrograman Prosedural FUNGSI (Subprogram) Tim Pengajar KU1071 Sem

Penggunaan Graf dalam Pemodelan Matematis Permainan Delapan Jari

BAB I ALGORITMA DAN FLOWCHART

STRATEGI DIVIDE AND CONQUER

Pertemuan XII ALGORITMA. Algoritma & Pemrograman Ken Kinanti P 1. {Pencarian Beruntun / Sequential Search}

Algoritma & Pemrograman

LAPORAN PRAKTIKUM ALGORITMA DAN STRUKTUR DATA Searching ( Pencarian ) Modul III

Rekursif/ Iterasi/ Pengulangan

BAB 6 Array Dua Dimensi

Memulai Pemrograman Pascal dengan Delphi Console 1. Buka aplikasi delphi 2. Pilih File New Other Console Application

PERBANDINGAN APLIKASI ALGORITMA BRUTE-FORCE DAN KOMBINASI ALGORITMA BREADTH FIRST SEARCH DAN GREEDY DALAM PENCARIAN SOLUSI PERMAINAN TREASURE HUNT

Algoritma Pemrograman

Transkripsi:

SOAL Soal 1. Selular Automata (LIFE) Permainan ini adalah permainan yang mensimulasikan kehidupan. Tempat permainannya berupa persegi dengan panjang sisi 100. Setiap sel dinyatakan dalam koordinat integer di persegi itu dan dapat bernilai mati atau hidup. Keadaan awal dari papan itu diberikan di input. Sebuah sel berhubungan dengan 8 sel di sekitarnya, kecuali untuk sel sel di pinggir papan. Cara bermainnya adalah melakukan langkah berikut 1. Sebuah sel mati, yang dikelilingi tepat oleh 3 sel hidup, akan menjadi sel hidup 2. Sebuah sel hidup yang memiliki 2 atau 3 orang kawan, akan tetap hidup 3. Selain kasus di atas, sel itu akan mati Catatan : penggantian keadaan sebuah sel harus dilakukan serentak untuk setiap langkahnya. Bila langkah ini diulang ulang, akan terjadi pola yang menarik yang berbeda beda untuk setiap keadaan awal. Anda diminta membuat program yang diberikan input dan jumlah langkahnya, memberikan keadaan akhir dari papan itu. INPUT Baris pertama dari input berisi 2 bilangan, N (1 <= N <= 2000) dan M, di mana N adalah jumlah langkah yang dilakukan, dan M adalah jumlah sel hidup awal. M baris berikutnya berisi dua bilangan R dan C, di mana R adalah nomor baris, dan C adalah nomor kolom. 1 <= R,C <= 100 OUTPUT Berisi beberapa baris yang masing masing baris terdiri dari 2 angka, R dan C, yang mencetak semua posisi sel hidup. Output harus diberikan dalam keadaan terurut menurut baris lalu menurut kolom. Contoh Input 1 200 10 10 40 10 41 10 42 10 43 10 44 10 45 10 46 10 47 10 48 10 49 Contoh output 1 8 41 Pemrograman Pascal Halaman ke-1 dari 1

8 48 9 40 9 41 9 48 9 49 10 39 10 40 10 41 10 48 10 49 10 50 11 40 11 41 11 48 11 49 12 41 12 48 Contoh input 2 1100 5 10 40 10 39 11 40 9 40 9 41 Contoh output 2 1 29 1 30 2 29 2 30 8 31 8 32 9 8 9 9 9 31 9 32 10 8 10 9 10 35 11 35 12 35 16 18 16 19 17 18 17 19 20 11 21 6 21 10 21 12 22 5 22 7 22 10 22 11 23 6 27 3 28 2 28 4 29 2 29 4 30 3 99 79 99 80 100 79 100 80 Pemrograman Pascal Halaman ke-2 dari 2

SOLUSI Solusi dari soal ini adalah dengam membuat dua buah matriks 2D berukuran 100 X 100, yang masing masing isi dari setiap matriks mewakili state dari suatu sel. Misalnya bila sel itu hidup, maka bernilai TRUE, dan bila mati bernilai FALSE. Lalu dilakukan looping sebanyak yang diminta, untuk melakukan perubahan perubahan state sesuai dengan aturan yang diminta. Cara melakukannya adalah memasukan keadaan dari langkah sebelumnya di matriks pertama, lalu mengisi keadaan matriks kedua berdasarkan peraturan dan data pada matriks pertama, setelah matriks kedua terisi, maka isi matriks pertama dicopy ke matriks kedua. Setelah melakukan iterasi itu sebanyak yang diminta, berikutnya kita melakukan tracing dari matriks kedua. Bila nilainya TRUE, maka cetak nomor baris dan kolomnya. ALGORITMA Baca input, masukan ke matriks1 -- Simulasikan langkah - langkah For I := 1 to n do Begin Matriks2 := syarat syarat dari data matriks 1 Matriks1 := matriks2; End; -- Cetak output For I := 1 to 100 do Begin For j := 1 to 100 do if matriks2[i,j] = TRUE then writeln(i,,j); End; SOURCE CODE {LIFE Widagdo Setiawan 2/9/2002} const Max = 100; var i,j,k,n,m,r,c,x : longint; map1,map2 : array [0..max+1,0..max+1] of boolean; assign(input,'life.in');reset(input); assign(output,'life.out');rewrite(output); readln(n,m); for i := 1 to m do readln(r,c); map1[r,c] := true; Pemrograman Pascal Halaman ke-3 dari 3

for k := 1 to n do for i := 1 to max do for j := 1 to max do x := 0; if map1[i-1,j-1] then inc(x); if map1[i-1,j] then inc(x); if map1[i-1,j+1] then inc(x); if map1[i,j-1] then inc(x); if map1[i,j+1] then inc(x); if map1[i+1,j-1] then inc(x); if map1[i+1,j] then inc(x); if map1[i+1,j+1] then inc(x); if (x =3 ) or (map1[i,j] and (x=2)) then map2[i,j] := true else map2[i,j] := false; map1 := map2; for i := 1 to 100 do for j := 1 to 100 do if map1[i,j] then writeln(i,' ',j); close(output); end. LATAR BELAKANG Permainan ini diciptakan oleh John Conway, seorang professor matematika di universitas Princeton. http://www.math.com/students/wonders/life/life.html Pemrograman Pascal Halaman ke-4 dari 4

SOAL Soal 2. Pengelompokan surat (ACSL) Untuk mempermudah pengiriman suatu pelayanan pos, suatu instansi harus membawa semua suratnya ke kantor pos dalam keadaan dikelompokkan menurut aturan tertentu dan tidak boleh ada kelompok yang berisi lebih dari 125 surat Pengelompokan surat itu dilakukan dengan menggunakan aturan dan urutan sebagai beirkut: 1. Kelompokkan 10 atau lebih surat yang mempunyai 5 digit kode pos yang sama dan tempelkan stiker D pada surat teratas. 2. Kelompokkan 10 atau lebih surat yang mempunyai 3 digit kode pos terdepan yang sama dan tempelkan stiker T pada surat teratas. 3. Kelompokkan 10 atau lebih surat ke Pusat Distribusi Daerah (PDD) yang sama dan tempelkan stiker A pada bagian atas. PDD adalah suatu cara untuk mengelompokkan beberapa kode pos yang berbeda. Untuk mengetahui suatu surat dikirim kle PDD mana, cukup dengan membaca 3 digit terdepan dari kode posnya. Berikut ini adalah tabel yang memperlihatkan PDD yang digunakan untuk kode pos yang 3 digit pertamanya seperti yang ditunjukkan dalam tabel itu. Sebagai contoh, PDD 028 digunakan untuk kode pos yang diawali dengan 020, 023, 024, 025,..., 029. PDD 3 digit Kode POS terdepan 105 004, 105-109 117 005, 115, 117-119 106 006-009 110 010-017 021 018, 019, 021, 022, 055 028 020, 023-029 Bila 3 digit terdepan dari suatu kode pos tidak masuk dalam PDD manapun, maka surat dengan kode pos itu tidak dapat dikelompokan dengan cara ini. 4. Kelompokkan surat yang lain dan tempelkan stiker M 2 buah kelompok dikatakan memiliki karakteristik sama apabila mempunyai stiker sama DAN memenuhi - bila stiker D, maka memiliki kode pos yang sama - bila stiker T, maka memiliki 3 digit terdepan kode pos yang sama - bila stiker A, maka memiliki PDD yang sama Diperbolehkan ada lebih dari 1 kelompok dengan karakteristik sama. Tetapi hanya 1 kelompok dari suatu karakterisitk yang boleh beranggotakan kurang dari 125 surat, sehingga kelompok lain dengan karakteristik itu, mempunya 125 anggota. Misal ada 507 surat dengan kode pos 11603 maka surat itu dikelompokkan dalam 4 kelompok dengan aturan A yang masing masing berisi 125 anggota, dan 7 surat sisanya dikelompokkan dengan aturan lain. Bila ada 515 surat dengan kode pos 11603, maka surat itu Pemrograman Pascal Halaman ke-5 dari 5

dikelompokkan dalam 5 kelompok dengan aturan A yang masing masing berisi 125, 125, 125, 125, 15. INPUT Baris pertama berisi integer positif N (1 <= N <= 15000) yang menyatakan banyaknya kelompok kode pos. N baris selanjutnya berisi 2 bilangan. Bilangan pertama menyatakan jumlah surat dengan suatu kodepos (1 <= X <= 60000) dan bilangan kedua menyatakan kodeposnya (00001 <= kodepos <= 20000). Sebagai contoh, pada baris pertama dari contoh menyatakan bahwa ada 8 surat yang menuju ke kode pos 02910 dan pada baris kedua menyatakan ada 6 surat yang menuju ke kode pos 01845. OUTPUT Output satu baris berisi 4 integer D, T, A, M yang masing masing dipisahkan dengan 1 spasi. Dimana : D jumlah kelompok dengan aturan 1 T jumlah kelompok dengan aturan 2 A jumlah kelompok dengan aturan 3 M jumlah kelompok dengan aturan 4 Contoh Input 1 2 8 02910 6 01845 Contoh output 1 0 0 0 1 Contoh input 2 8 8 02910 16 02920 2 01824 6 01834 9 01845 5 01937 5 02244 15 02736 Contoh Output 2 2 1 1 1 Pemrograman Pascal Halaman ke-6 dari 6

SOLUSI Cara termudah untuk menyelesaikan masalah ini adalah dengan membrute force. Pertama kita membuat array dari 1..20000, yang isinya jumlah dari surat dalam kode pos itu. Lalu kita berusaha mengelompokkan sebanyak mungkin surat dengan aturan D, lalu dengan aturan T, lalu dengan aturan A, dan terakhir dengan aturan M. ALGORITMA Baca input dan masukan dalam array Jum -- Aturan D for I := 1 to 20000 { I adalah kodepos } jika JUM[i] > 10 maka kelompokkan ke D sampai JUM[i] < 10 -- Aturan T for I := 1 to 200 do { I adalah 3 digit terdepan} For J := 0 to 99 do { J adalah 2 digit belakang } Begin K := I * 100 + j { K adalah kodeposnya } Kelompokkan untuk I yang sama dengan aturan T; End; -- Aturan A Sama seperti aturan T, tapi bukan untuk I yang sama, melainkan untuk setiap I dalam PDD yang sama. -- Aturan M Kelompokkan sisanya dengan aturan ini. -- Cetak Writeln(D,,T,,A,,M); SOURCE CODE {ACSL Widagdo Setiawan 2/9/2002} Const PDD : array [1..6,1..8] of integer = ( (4,105,106,107,108,109,201,201), (5,115,117,118,119,201,201,201), (6,7,8,9,201,201,201,201), (10,11,12,13,14,15,16,17), (18,19,21,22,55,201,201,201), Pemrograman Pascal Halaman ke-7 dari 7

(20,23,24,25,26,27,28,29)); var i,j,k,n,d,t,a,m,l,p: longint; Jumlah : array [1..20000] of integer; Jum3 : array [0..200] of integer; ada : boolean; assign(input,'acsl.in');reset(input); assign(output,'acsl.out');rewrite(output); readln(n); for i := 1 to n do readln(j,k); inc(jumlah[k],j); for i := 1 to 20000 do if jumlah[i] < 10 then continue; d := d + jumlah[i] div 125; jumlah[i] := jumlah[i] - (jumlah[i] div 125) * 125; if jumlah[i] >= 10 then jumlah[i] := 0; inc(d); for i := 0 to 200 do k := 0; for j := i * 100 to i * 100 + 99 do k := k + jumlah[j]; if k >= 10 then t := t + k div 125; l := 0; if k - k div 125 >= 10 then inc(t); for j := i * 100 to i * 100 + 99 do jumlah[j] := 0; end else for j := i * 100 to i * 100 + 99 do Pemrograman Pascal Halaman ke-8 dari 8

l := l + jumlah[j]; if l > (k div 125) * 125 then jumlah[j] := l - (k div 125) * 125; break; end else jumlah[j] := 0; for p := 1 to 6 do k := 0; for i := 0 to 200 do ada := false; for j := 1 to 8 do if pdd[p,j] = i then ada := true; if not ada then continue; for j := i * 100 to i * 100 + 99 do k := k + jumlah[j]; if k >= 10 then a := a + k div 125; l := 0; if k - k div 125 >= 10 then inc(a); for i := 0 to 200 do ada := false; for j := 1 to 8 do if pdd[p,j] = i then ada := true; if not ada then continue; for j := i * 100 to i * 100 + 99 do OLIMPIADE NASIONAL INFORMATIKA 2003 Pemrograman Pascal Halaman ke-9 dari 9

jumlah[j] := 0; end else for i := 0 to 200 do ada := false; for j := 1 to 8 do if pdd[p,j] = i then ada := true; if not ada then continue; for j := i * 100 to i * 100 + 99 do l := l + jumlah[j]; if l > (k div 125) * 125 then jumlah[j] := l - (k div 125) * 125; break; end else jumlah[j] := 0; k := 0; for i := 1 to 20000 do k := j + jumlah[i]; m := m + k div 125; if k - (k div 125) * 125 > 1 then inc(m); writeln(d,' ',t,' ',a,' ',m); close(output); end. OLIMPIADE NASIONAL INFORMATIKA 2003 Pemrograman Pascal Halaman ke-10 dari 10

SOAL Soal 3. Tic-Tac-Toe 3 Dimensi (TTT3D) Persoalan ini memperluas permainan tic -tac-toe ke satu dimensi lebih tinggi. Bayangkanlah 3 buah papan tic -tac-toe yang ditumpuk ke atas sehingga ada 27 bujur sangkar untuk memasang suatu koin. Permainan ini dimainkan oleh dua pemain, X dan O, dengan meletakkan koin secara bergantian pada sebuah bujur sangkar. Pemenangnya adalah pemain pertama yang dapat menempatkan 3 koin dalam satu baris. Tentu saja, bujursangkarbujursangkar itu tidak harus dari papan yang sama; tetapi menghubungkan pusat-pusat bujursangkar jelas membentuk sebuah garis lurus. INPUT Input terdiri dari 2 baris, baris pertama berisi konfigurasi awal X dan O dan baris kedua berisi nomor bujursangkar untuk menempatkan X yang berikutnya. Konfigurasi awal disajikan dengan deretan 27 karakter yang berisi X dan O (huruf O, bukan angka 0) dan * (untuk mewakili bujursangkar yang kosong). Deretan karakter O*O**X*XOO*X*X*OO*X*X*X***O mewakili tiga papan tic -tac-toe sebagai berikut: O * O O * X X * X * * X * X * * X * * X O O O * * * O Bawah Tengah Atas Penempatan X berikutnya dinyatakan dengan bilangan bulat 1 sampai 27 yang manyatakan 27 bujursangkar yang ada. Cara penomorannya sama dengan cara urutan penempatan karakter dari untai 27-karakter yang menyatakan konfigurasi awal tersebut. Sebagai contoh, O pada papan di atas adalah nomor 1, 3, 9, 10, 16, 17, dan 27. OUTPUT Tentukan apakah X menang (membentuk garis lurus), dan jika ya tuliskan posisi garis X dalam 1 baris, dan dipisahkan oleh spasi. Angka pertama < angka kedua < angka ketiga Jika X dapat menang dalam beberapa cara, kamu harus menulis semua kemungkinan itu, dalam keadaan angka pertama terurut dari kecil ke besar, lalu angka kedua juga terurut dari kecil ke besar. Jika X tidak dapat menang, cetak angka nol (0). Contoh Input 1 O*O**X*XOO*X*X*OO*X*X*X***O 5 Contoh Input 2 XO**X*O**O***X*XXO**X***O*O 11 Contoh Output 1 5 14 23 Contoh Output 2 1 11 21 11 14 17 Pemrograman Pascal Halaman ke-11 dari 11

SOLUSI Cara mudah untuk menyelesaikan soal ini adalah dengan memprecount dulu semua kemungkinan garis yang dibuat dari kubus itu. Langkah selanjutnya tinggal mencocokan keadaan data, apakah ada membentuk garis sesuai hasil precountnya. Untuk setiap garis hasilnya disimpan dulu, lalu diurutkan, dan terakhir dicetak. ALGORITMA Baca Input Bandingkan Input dengan table garis, bila ada, maka catat hasilnya Sort hasil yang tadi didapat sesuai aturan di soal Cetak hasil SOURCE CODE {TTT3D Widagdo Setiawan 2/9/2002} const win : array [1..49,1..3] of longint = ( ( 1, 2, 3), (4,5,6 ), ( 7,8,9 ), ( 10,11,12 ), (13,14,15 ), (16,17,18 ), (19,20,21), (22,23,24), (25,26,27), (1,4,7), (2,5,8), (3,6,9), (10,13,16), (11,14,17), (12,15,18), (19,22,25), (20,23,26), (21,24,27), (1,10,19), (2,11,20), (3,12,21), (4,13,22), (5,14,23), (6,15,24), (7,16,25), (8,17,26), (9,18,27), (1,5,9), (3,5,7), (10,14,18), (12,14,16), (19,23,27), (21,23,25), (1,13,25), (19,13,7), (2,14,26), (20,14,8), (3,15,27), (21,15,9), (1,11,21), (3,11,19), (4,14,24), (6,14,22), (7,17,27), (9,17,25), (1,14,27), (3,14,25), (9,14,19), (7,14,21)); var i,j,k,nh,t : longint; map : array [1..27] of boolean; hasil : array [1..48,1..3] of longint; ch : char; assign(input,'ttt3d.in');reset(input); assign(output,'ttt3d.out');rewrite(output); for i := 1 to 27 do read(ch); if ch = 'X' then map[i] := true; readln; Pemrograman Pascal Halaman ke-12 dari 12

readln(k); map[k] := true; for i := 1 to 49 do if (win[i,1]<>k) and (win[i,2]<>k) and (win[i,3]<>k) then continue; if map[win[i,1]] and map[win[i,2]] and map[win[i,3]] then inc(nh); hasil[nh,1] := win[i,1]; hasil[nh,2] := win[i,2]; hasil[nh,3] := win[i,3]; for i := 1 to nh do for j := 1 to 2 do for k := j + 1 to 3 do if hasil[i,j] > hasil[i,k] then t := hasil[i,j]; hasil[i,j] := hasil[i,k]; hasil[i,k] := t; for i := 1 to nh - 1 do for j := i + 1 to nh do if (hasil[i,1] > hasil[j,1]) or ((hasil[i,1] = hasil[j,1]) and (hasil[i,2] > hasil[j,2])) then hasil[48] := hasil[i]; hasil[i] := hasil[j]; hasil[j] := hasil[48]; for i := 1 to nh do writeln(hasil[i,1],' ',hasil[i,2],' ',hasil[i,3]); if nh = 0 then writeln(0); close(output); end. Pemrograman Pascal Halaman ke-13 dari 13

SOAL Soal 4. Clock (CLOCK) IOI'94 : The Clocks ------- ------- ------- ---O ---O O ------- ------- ------- A B C ------- ------- ------- O O O ------- ------- ------- D E F ------- ------- ------- O O--- O ------- ------- ------- G H I Ada 9 jam dengan bentuk matriks 3 X 3. Tujuan dari permainan ini adalah mengatur agar semua posisi jam menunjuk arah jam 12, dengan langkah sesedikit mungkin. Ada 9 tombol yang berguna untuk memutar jam, dengan karakteristik berbeda beda. Karakteristiknya yaitu : Tombol Jam yang berubah 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI Setiap langkah, akan memutar jam sebesar 90. Input Ada sembilan integer dari 0..3. Yang artinya 0=12 o'clock, 1=3 o'clock, 2=6 o'clock, 3=9 o'clock. Pemrograman Pascal Halaman ke-14 dari 14

Output Tampilkan langkah terpendek dalam urutan poemencetan tombol. Output harus diberikan secara terurut dari kecil ke besar, dan bila ada beberapa solusi untuk jumlah langkah minimum, dipilih solusi yang menampilkan urutan angka terkecil. Contoh Input 3 3 0 2 2 2 2 1 2 Contoh output 4589 Contoh gerakan yang dilakukan dalam setiap langkah 0 = 12 o'clock 1 = 3 o'clock 2 = 6 o'clock 3 = 9 o'clock 3 3 0 3 0 0 3 0 0 0 0 0 0 0 0 2 2 2 5-> 3 3 3 8-> 3 3 3 4 -> 0 3 3 9-> 0 0 0 2 1 2 2 2 2 3 3 3 0 3 3 0 0 0 Pemrograman Pascal Halaman ke-15 dari 15

SOLUSI Bila dianalisa, terlihat bahwa tidak ada gunanya menekan tombol yang sama lebih dari 3 kali, jadi hanya ada 4 kemungkinan untuk setiap tombol, yaitu 0 kali, 1 kali, 2 kali, dan 3 kali. Lalu terlihat pula bahwa, urutan menekan tombol tidak menjadi masalah. Jadi hanya ada 4^9 cara penekanan tombol yang mungkin (262.144 cara). Angka itu cukup kecil, jadi kita dapat mencobanya satu persatu, dan melihat jawaban yang menghasilkan semua 0. Bila menemukan jawaban yang lebih pendek kita memakai jawaban itu, dan bila menemukan jawaban yang sama panjang, kita memakai jawaban yang menggunakan angka kecil terbanyak, seperti yang dikatakan di soal. ALGORITMA Baca input For setiap kemungkinan penekanan tombol do if hasil = semua nol then if jumlah langkah < jumlah langkah sebelum then catat hasil Cetak hasil SOURCE CODE {CLOCK Widagdo Setiawan 2/9/2002} const tabel : array [1..9,1..9] of boolean = ( (TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE), (TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE), (FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE), (TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE), (FALSE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,FALSE), (FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE), (FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE), (FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE), (FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE)); var i,j,k,min : longint; map : array [1..9] of longint; langkah,hasil : array [1..9] of longint; Procedure putar(x:longint); var i : longint; for i := 1 to 9 do if not tabel[x,i] then continue; inc(map[i]); Pemrograman Pascal Halaman ke-16 dari 16

if map[i] = 4 then map[i] := 0; Procedure rekursi (lev : longint); var i,j,k : longint; if lev = 10 then for i := 1 to 9 do if map[i] > 0 then exit; k := 0; for i := 1 to 9 do k := k + langkah[i]; if min > k then min := k; hasil := langkah; end else if min = k then for i := 1 to 9 do if hasil[i] > langkah[i] then hasil := langkah; break; exit; rekursi(lev+1); inc(langkah[lev]);putar(lev);rekursi(lev+1); inc(langkah[lev]);putar(lev);rekursi(lev+1); inc(langkah[lev]);putar(lev);rekursi(lev+1); langkah[lev] := 0; putar(lev); assign(input,'clock.in');reset(input); assign(output,'clock.out');rewrite(output); for i := 1 to 9 do read(map[i]); min := 10000; rekursi(1); for i := 1 to 9 do for j := 1 to hasil[i] do write(i); writeln; close(output); end. Pemrograman Pascal Halaman ke-17 dari 17