Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rekursi Lanjut

Rekursi Lanjut

Pembahasan Training Gate TLX Chapter 13 : Rekursi Lanjut
https://training.ia-toki.org/training/curriculums/1/courses/1/chapters/18/problems

More Decks by Catatan Olimpiade Informatika

Other Decks in Programming

Transcript

  1. Pembahasan Training Gate TLX Chapter 13 ‐ Rekursi Lanjut ©

    Mamat Rahmat http://olimpiadeinformatika.com
  2. Menggambar Pegunungan Menggambang Pegunungan setinggi N = Menggambang Pegunungan setinggi

    N‐1 Menulis N buah * Menggambang Pegunungan setinggi N‐1 gunung(N) { gunung(N‐1) for i = 1 to N print '*' print endline gunung(N‐1) }
  3. Permutasi Zig‐Zag Buat semua permutasi bilangan 1‐N, cek apakah berbentuk

    zigzag zigzag() { for i = 2 to N‐1 do if not (((bil[i]>bil[i+1]) and (bil[i]>bil[i‐1])) or ((bil[i]<bil[i+1]) and (bil[i]<bil[i‐1]))) return false return true } rec(idx) { if (idx = N+1) if zigzag() print bil[1]..bil[N] else for i = 1 to N if (not choose[i]) bil[idx] = i choose[i] = true rec(idx+1) choose[i] = false }
  4. Brankas Terkunci Untuk membuat kombinasi K dari N bilangan, mulai

    for dari setelah bilangan yang dipilih sebelumnya rec(idx) { if (idx = K+1) print bil[1]..bil[K] else for i = bil[idx‐1]+1 to N bil[idx] = i rec(idx+1) }
  5. Quadtree I: Pengodean Saat kita melakukan pengodean, kita mulai dari

    persegi awal. Mula‐mula cek apakah persegi itu homogen? Jika homogen 0, abaikan Jika homogen 1, simpan kode Jika tidak homogen, lanjutkan pengodean untuk subpersegi kiri‐atas, kanan‐atas, kiri‐bawah, kanan‐bawah State yang dibutuhkan adalah batas atas, batas bawah, batas kiri, batas kanan dan kodenya
  6. rec(at, ba, ki, ka, kode) { if persegi[at..ba][ki..ka] homogen 0

    // no action else if persegi[at..ba][ki..ka] homogen 1 simpan kode, misal ke vector else { rec(at, (at+ba)/2, ki, (ki+ka)/2, kode+"0") // kiri atas rec(...) // kanan atas rec(...) // kiri bawah rec(...) // kanan bawah } } P = 1 while (P < R || P < C) P *= 2 rec(1,P,1,P)
  7. Quadtree II: Penerjemahan Untuk setiap kode, karakter kedua hingga terakhir

    menunjukkan langkah menelusuri sub‐persegi ke dalam Setelah ditelusuri hingga ke dalam, warnai sub‐persegi ini dengan 1 for i := 1 to N at = 1 ba = P ki = 1 ka = P for j := 2 to length(S[i]) if (s[i][j] = '0') ba = (at+ba)/2 ka = (ki+ka)/2 else // dst untuk '1','2','3' for x = at to ba for y = ki to ka persegi[x][y] = '1'
  8. Jawbreaker I: Klik! Pada soal ini kita diminta untuk menelusuri

    grid mulai dari suatu titik menyebar ke kiri,kanan,atas,bawah yang bilangannya sama ﴾gunakan rekursi﴿ Algoritma ini disebut floodfill Kita harus menandai titik mana saja yang sudah dikunjungi agar tidak dikunjungi lagi ﴾infinite recursion﴿ rec(a, b) { if (a>=1 and a<=n and b>=1 and b<=m) if (not visited[a][b] and grid[a][b]=grid[x][y]) visited[a][b] = true; tot++; rec(a+1,b); rec(a‐1,b); rec(a,b+1); rec(a,b‐1); } rec(x, y)