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 }
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) }
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
// 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)
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'
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)