Thursday, January 20, 2011

stable mariage

The Stable Marriage Problem

Ada 8 pasang pria (man) dan wanita (woman), maka array yang terbentuk adalah sebagai berikut :
1. man = 8
2. woman = 8
3. rank = 8
4. mP(man, rank) = mP (8, 8)
contoh:

Man\ Rank 1 2 3 4 5 6 7 8
Man 1 select woman 3 6 7 1 8 4 5 2
2 6 3 1 3 5 8 2 7
3 8 4 1 5 6 3 7 2
4 3 8 4 2 5 6 7 1
5 8 3 4 5 6 1 7 2
6 8 7 5 2 4 3 1 6
7 2 4 6 3 1 7 5 8
8 6 1 4 2 7 5 3 8

5. wP(woman, rank) = wP(8, 8)
6. m(man) = m(8)
7. w(woman) = w(8)
8. single(woman) = single(8) = (T, T, T, T, T, T, T, T)  merupakan array Boolean
ABSTRAKSI
PROCEDURE try(man,sukses)
r = ranking
FOR r = 1 sampai 8
Pemilihan woman oleh man berdasarkan ranking
IF woman tsb single ?
THEN Pasangkan man dengan woman single dan woman tsb tidak single
IF man<8 THEN CALL try(man+1, sukses_berikut ELSE cetak pasangan Batalkan Pasangan RETURN ANALISA 1. Level = 8 2. Prioritas = 8 3. Ambil tindakan = Pasangkan man dengan woman single dan single = false for (int i = 0; i < m.length; i++) { System.out.println(i + " + " + m[i]); } 4. if tindakan dapat dilakukan = Apakah Wanita tsb single ? int[] single = new int[n]; final int TRUE = -1; for (int i = 0; i < single.length; i++) single[i] = TRUE; for (int i = 0; i < single.length; i++) PriaFree.add(i); int[] next = new int[n]; while (!PriaFree.isEmpty()) { int m = PriaFree.remove(); int w = mP[m][next[m]]; next[m]++; System.out.println("m=" + m + " w=" + w); if (single[w] == TRUE) { single[w] = m; 5. batalkan tindakan = Batalkan Pernikahan(Pilih wanita/pria lain) int m1 = single[w]; if (prefers(w, m, m1)) { single[w] = m; PriaFree.add(m1); } else { PriaFree.add(m); } private boolean prefers(int w, int x, int y) { for (int i = 0; i < 8; i++) { int pref = wP[w][i]; if (pref == x) return true; if (pref == y) return false; } // This should never happen. System.out.println("Error in wP list " + w); return false; } Program import java.util.*; import java.io.*; public class StableMarriage { private int n ; private int[][] mP; private int[][] wP; private static final boolean DEBUGGING = false; private Random rand = new Random(); public static void main(String[] args) { if (args.length != 1) { int n = 8; StableMarriage sm = new StableMarriage(n); if (n <= 10) sm.printPrefTables(); int[] marriage = sm.stable(); if (n <= 10) sm.printMarriage(marriage); return; } } public StableMarriage(int n) { this.n = n; mP = new int[n][]; wP = new int[n][]; for (int i = 0; i < n; i++) { mP[i] = new int[n]; createRandomPrefs(mP[i]); wP[i] = new int[n]; createRandomPrefs(wP[i]); } } private void createRandomPrefs(int[] v) { for (int i = 0; i < v.length; i++) v[i] = i; for (int i = v.length - 1; i > 0; i--) {
int j = rand.nextInt(i+1);
int temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
public int[] stable() {
int[] single = new int[n];
final int TRUE = -1;
for (int i = 0; i < single.length; i++) single[i] = TRUE; LinkedList PriaFree = new LinkedList();
for (int i = 0; i < single.length; i++) PriaFree.add(i); int[] next = new int[n]; while (!PriaFree.isEmpty()) { int m = PriaFree.remove(); int w = mP[m][next[m]]; next[m]++; System.out.println("Pasangan”); System.out.println("m=" + m + " w=" + w); if (single[w] == TRUE) { single[w] = m; } else { int m1 = single[w]; if (prefers(w, m, m1)) { single[w] = m; PriaFree.add(m1); } else { PriaFree.add(m); } } } return single; } private boolean prefers(int w, int x, int y) { for (int i = 0; i < 4; i++) { int pref = wP[w][i]; if (pref == x) return true; if (pref == y) return false; } System.out.println("Error in wP list " + w); return false; } public void printPrefTables() { System.out.println("Man List:"); printMatrix(mP); System.out.println("Woman List:"); printMatrix(wP); } private void printMarriage(int[] m) { System.out.println("Pernikahan: "); for (int i = 0; i < m.length; i++) System.out.println(‘(’ + i + " + " + m[i] + ‘)’); } private void printDebug(String s) { if (DEBUGGING) { System.out.println(s); } } private void printMatrix(int[][] v) { if (v == null) { System.out.println("");
return;
}
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v[i].length; j++)
System.out.print(v[i][j] + " ");
System.out.println();
}
}
}

HASIL :

Man List

Woman List

Pasangan

Pernikahan :
(0,4)
(1,5)
(2,7)
(3,6)
(4,1)
(5,0)
(6,3)
(7,2)

Urut data array dengan metode insertion Sort

CALL InputVectorDariRandom(X,N)
document.write" Metode pengurutan data dengan Insertion Sort
"
document.write "
"
CALL Cetak(x,n," Sebelum Sorting :")
CALL insertionSort(x,n)
CALL Cetak(x,n," Setelah Sorting :")

SUB InputVectorDariRandom(byRef v(), byRef N)
RANDOMIZE
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR c=1 TO N
v(c)=10+int(rnd*90)
NEXT
END SUB

SUB insertionSort(byRef v(), byVal N)
FOR i=1 TO N
temp=v(i)
j=i-1
do while (j>=0) and (v(j)>temp)
v(j+1)=v(j)
j=j-1
loop
v(j+1)=temp
NEXT
END SUB

SUB Cetak(byVal v(), byVal N, message)
document.write "Isi Vektor " & message & "
"
FOR c=1 TO N
document.write v(c) & ", "
NEXT
document.write "
"
document.write "
"
END SUB

Urut data array dengan metode Selection Sort

CALL InputVectorDariRandom(X,N)
document.write" Metode pengurutan data dengan Selection Sort
"
document.write "
"
CALL Cetak(x,n," Sebelum Sorting :")
CALL SelectionSort(x,n)
CALL Cetak(x,n," Setelah Sorting :")

SUB InputVectorDariRandom(byRef v(), byRef N)
RANDOMIZE
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR c=1 TO N
v(c)=10+int(rnd*90)
NEXT
END SUB

SUB SelectionSort(byRef v(), byVal jumlah)
FOR i=1 TO jumlah-1
MIN = i
FOR j=I+1 TO jumlah
IF v(j)< v ( MIN ) THEN MIN=j NEXT IF i<>MIN THEN
temp=v(i)
v(i)=v(MIN)
v(MIN)=temp
END IF
NEXT
END SUB

SUB Cetak(byVal v(), byVal N, message)
document.write "Isi Vektor " & message & "
"
FOR c=1 TO N
document.write v(c) & ", "
NEXT
document.write "
"
document.write "
"
END SUB

Urut data array dengan metode Bubble Sort

CALL InputVectorDariRandom(X,N)
document.write" Metode pengurutan data dengan Bubble Sort
"
document.write "
"
CALL Cetak(x,n," Sebelum Sorting :")
CALL StandardBubbleSort(x,n)
CALL Cetak(x,n," Setelah Sorting :")

SUB InputVectorDariRandom(byRef v(), byRef N)
RANDOMIZE
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR c=1 TO N
v(c)=10+int(rnd*90)
NEXT
END SUB

SUB StandardBubbleSort(byRef v(), byVal jumlah)
FOR i=1 TO jumlah-1
FOR j=1 TO jumlah-I
IF v(j)>v(j+1) THEN
temp=v(j)
v(j)=v(j+1)
v(j+1)=temp
END IF
NEXT
NEXT
END SUB

SUB Cetak(byVal v(), byVal N, message)
document.write "Isi Vektor " & message & "
"
FOR c=1 TO N
document.write v(c) & ", "
NEXT
document.write "
"
document.write "
"
END SUB

Urut data array dengan metode Straight Selection Sort

CALL InputVectorDariRandom(X,N)
document.write" Metode pengurutan data dengan straight selection sort
"
document.write "
"
CALL Cetak(x,n," Sebelum Sorting :")
CALL StraightSelectionSort(x,n)
CALL Cetak(x,n," Setelah Sorting :")

SUB InputVectorDariRandom(byRef v(), byRef N)
RANDOMIZE
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR c=1 TO N
v(c)=10+int(rnd*90)
NEXT
END SUB

SUB StraightSelectionSort(byRef v(), byVal N)
FOR i=1 TO N-1
FOR j=i+1 TO N
IF v(i)>v(j) THEN
temp=v(i)
v(i)=v(j)
v(j)=temp
END IF
NEXT
NEXT
END SUB

SUB Cetak(byVal v(), byVal N, message)
document.write "Isi Vektor " & message & "
"
FOR c=1 TO N
document.write v(c) & ", "
NEXT
document.write "
"
document.write "
"
END SUB

KNIGHT TOUR TRACE

DO
N = cint(InputBox("Masukkan Ukuran Papan Catur"))
LOOP UNTIL N>=3 AND N<=30 REDIM Papan(N+4,N+4) FOR i=1 TO N+4 FOR j=1 TO N+4 IF i<3 OR j<3 OR i>N+2 OR j>N+2 THEN
Papan(i,j)=99
ELSE
Papan(i,j)=0
END IF
NEXT
NEXT

V = Array(,-2,-1,1,2,2,1,-1,-2)
H = Array(,1,2,2,1,-1,-2,-2,-1)

DO
yAw = cint(InputBox("Masukkan Nomor Baris Awal Kuda"))
xAw = cint(InputBox("Masukkan Nomor Kolom Awal Kuda"))
LOOP UNTIL xAw<=N AND xAw>=1 AND yAw<=N AND yAw>=1
y = yAw+2
x = xAw+2
NoStep=1
Papan(y,x)=NoStep
NoStep=NoStep+1

sukses = false
CALL Try(NoStep, y, x, sukses)
IF sukses=TRUE THEN
CALL CetakPapan()
ELSE
document.write "Tidak Ada Solusinya!!!
"
END IF

SUB Try(byVal i, byVal y, byVal x, byRef sukses)
document.write "Coba Langkah " & i & "
"
p = 0
DO
p = p + 1
document.write "
Coba Prioritas " & p & " "
suksesBerikut = FALSE
IF Papan(y+v(p),x+h(p))=0 THEN
document.write " ---> SUKSES
"
yNext = y+v(p)
xNext = x+h(p)
Papan(yNext,xNext) = i
IF i< n ^ 2 THEN CALL Try(i+1, yNext, xNext, suksesBerikut) IF suksesBerikut = FALSE THEN Papan(yNext,xNext) = 0 END IF ELSE suksesBerikut = TRUE END IF END IF LOOP UNTIL suksesBerikut = TRUE OR p = 8 IF p=8 THEN document.write "Langkah " & i & " Backtrack, karena semua gagal " sukses = suksesBerikut END SUB SUB CetakPapan() document.write "Papan Catur :
"
document.write "" FOR i=3 TO N+2 document.write " " FOR j=3 TO N+2 document.write "" NEXT document.write " " NEXT document.write "
" & Papan(i,j) & "
"
END SUB

RECURSIVE ARRAY 5

'----- Program Utama -----
CALL InputVectorDariRandom(x,N)
CALL CetakVectorKeSamping(x,N,"x","Isi Vektor :")
cari = cint(InputBox("Masukkan Bilangan yang Dicari"))


'----- Koleksi Modul -----
SUB InputVectorDariKeyboard(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = cint(InputBox("Masukkan Isi Elemen ke-" & i))
NEXT
END SUB

SUB InputVectorDariRandom(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = 10 + int(rnd*90)
NEXT
END SUB

SUB CetakVector(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write nama & "(" & i & ") = " & v(i) & "
"
NEXT
END SUB

SUB CetakVectorKeSamping(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write v(i) & ", "
NEXT
document.write "
"
END SUB

RECURSIVE ARRAY 4

'----- Program Utama -----
CALL InputVectorDariRandom(x,N)
CALL CetakVectorKeSamping(x,N,"x","Isi Vektor :")
document.write "Nilai Maximal = " & maxR(x,1,N) & "
"
document.write "Total = " & totR(x,1,N) & "
"

'----- Koleksi Modul -----
SUB InputVectorDariKeyboard(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = cint(InputBox("Masukkan Isi Elemen ke-" & i))
NEXT
END SUB

SUB InputVectorDariRandom(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = 10 + int(rnd*10)
NEXT
END SUB

SUB CetakVector(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write nama & "(" & i & ") = " & v(i) & "
"
NEXT
END SUB

SUB CetakVectorKeSamping(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write v(i) & ", "
NEXT
document.write "
"
END SUB

FUNCTION maxR(byVal v(), byVal aw, byVal ak)
IF aw=ak THEN
maxR = v(aw)
ELSE
maxKanan = maxR(v,aw+1,ak)
IF v(aw)>maxKanan THEN maxR = v(aw) ELSE maxR=maxKanan
END IF
END FUNCTION

FUNCTION totR(byVal v(), byVal aw, byVal ak)
IF aw=ak THEN
totR = v(aw)
ELSE
tgh = (aw+ak)\2
totKiri = totR(v,aw,tgh)
totKanan = totR(v,tgh+1,ak)
totR = totKiri + totKanan
END IF
END FUNCTION

RECURSIVE ARRAY 3

'----- Program Utama -----
CALL InputVectorDariRandom(x,N)
CALL CetakVectorKeSamping(x,N,"x","Isi Vektor :")
document.write "Nilai Maximal = " & maxR(x,1,N) & "
"
document.write "Total = " & totR(x,1,N) & "
"

'----- Koleksi Modul -----
SUB InputVectorDariKeyboard(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = cint(InputBox("Masukkan Isi Elemen ke-" & i))
NEXT
END SUB

SUB InputVectorDariRandom(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = 10 + int(rnd*10)
NEXT
END SUB

SUB CetakVector(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write nama & "(" & i & ") = " & v(i) & "
"
NEXT
END SUB

SUB CetakVectorKeSamping(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write v(i) & ", "
NEXT
document.write "
"
END SUB

FUNCTION maxR(byVal v(), byVal aw, byVal ak)
IF aw=ak THEN
maxR = v(aw)
ELSE
tgh = (aw+ak)\2
maxKiri = maxR(v,aw,tgh)
maxKanan = maxR(v,tgh+1,ak)
IF maxKiri>maxKanan THEN maxR = maxKiri ELSE maxR=maxKanan
END IF
END FUNCTION

FUNCTION totR(byVal v(), byVal aw, byVal ak)
IF aw=ak THEN
totR = v(aw)
ELSE
tgh = (aw+ak)\2
totKiri = totR(v,aw,tgh)
totKanan = totR(v,tgh+1,ak)
totR = totKiri + totKanan
END IF
END FUNCTION

RECURSIVE ARRAY 2

'----- Program Utama -----
CALL InputVectorDariRandom(x,N)
CALL CetakVectorKeSamping(x,N,"x","Isi Vektor :")
document.write "Nilai Maximal = " & maxHC(x,N) & "
"
document.write "Nilai Maximal = " & maxR(x,1,N) & "
"

'----- Koleksi Modul -----
SUB InputVectorDariKeyboard(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = cint(InputBox("Masukkan Isi Elemen ke-" & i))
NEXT
END SUB

SUB InputVectorDariRandom(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = 100 + int(rnd*900)
NEXT
END SUB

SUB CetakVector(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write nama & "(" & i & ") = " & v(i) & "
"
NEXT
END SUB

SUB CetakVectorKeSamping(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write v(i) & ", "
NEXT
document.write "
"
END SUB

FUNCTION maxHC(byVal v(), byVal N)
maxHC = -1
FOR c=1 TO N
IF v(c)>maxHC THEN maxHC=v(c)
NEXT
END FUNCTION

FUNCTION maxR(byVal v(), byVal aw, byVal ak)
IF aw=ak THEN
maxR = v(aw)
ELSE
tgh = (aw+ak)\2
maxKiri = maxR(v,aw,tgh)
maxKanan = maxR(v,tgh+1,ak)
IF maxKiri>maxKanan THEN maxR = maxKiri ELSE maxR=maxKanan
END IF
END FUNCTION

RECURSIVE ARRAY 1

'----- Program Utama -----
CALL InputVectorDariRandom(x,N)
CALL CetakVectorKeSamping(x,N,"x","Isi Vektor :")
document.write "Nilai Maximal = " & maxHC(x,N) & "
"

'----- Koleksi Modul -----
SUB InputVectorDariKeyboard(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = cint(InputBox("Masukkan Isi Elemen ke-" & i))
NEXT
END SUB

SUB InputVectorDariRandom(byRef v(), byRef N)
N = cint(InputBox("Masukkan Jumlah Elemen Array"))
REDIM v(N)
FOR i=1 TO N
v(i) = 100 + int(rnd*900)
NEXT
END SUB

SUB CetakVector(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write nama & "(" & i & ") = " & v(i) & "
"
NEXT
END SUB

SUB CetakVectorKeSamping(byVal v(), byVal N, byVal nama, byVal message)
document.write "
" & message & "
"
FOR i=1 TO N
document.write v(i) & ", "
NEXT
document.write "
"
END SUB

FUNCTION maxHC(byVal v(), byVal N)
maxHC = -1
FOR c=1 TO N
IF v(c)>maxHC THEN maxHC=v(c)
NEXT
END FUNCTION

RECURSIVE 6

B = cint(InputBox("Mencari Bilangan Fibonacci ke berapa?"))
document.write "Bilangan Fibonacci ke-" & B & " adalah " & Fibo(B) & "
"

FUNCTION Fibo(byVal N)
IF N=1 THEN
Fibo = 0
ELSEIF N=2 THEN
Fibo = 1
ELSE
Fibo = Fibo(N-2) + Fibo(N-1)
END IF
END FUNCTION

RECURSIVE 5

B = cint(InputBox("Masukkan Bilangan"))
document.write "Factorial dari " & B & " adalah " & Fact(B) & "
"
CALL CalcFact(B,H)
document.write "Factorial dari " & B & " adalah " & H & "
"

FUNCTION Fact(byVal N)
IF N>0 THEN
Fact = N * Fact(N-1)
ELSE
Fact = 1
END IF
END FUNCTION

SUB CalcFact(byVal N, byRef F)
IF N>0 THEN
CALL CalcFact(N-1, temp)
F = N * temp
ELSE
F = 1
END IF
END SUB

RECURSIVE 4

B = cint(InputBox("Masukkan Bilangan"))
document.write "Factorial dari " & B & " adalah " & Fact(B)

FUNCTION Fact(byVal N)
IF N>0 THEN
Fact = N * Fact(N-1)
ELSE
Fact = 1
END IF
END FUNCTION

habis di bagi tidak boleh kembar

dim unused(9)
FOR i=1 TO 9
unused(i)=TRUE
NEXT
sukses = false
bil = 0
CALL Try(1, sukses)
IF sukses=TRUE THEN
document.write "Bilangan yang Dicari adalah " & bil & "
"
ELSE
document.write "Tidak Ada Bilangan dengan Sifat Tersebut!!!
"
END IF

SUB Try(byVal i, byRef sukses)
p = 0
DO
p = p + 1
suksesBerikut = FALSE
IF unused(p) = TRUE AND ((bil*10+p) MOD i = 0) THEN
bil = bil * 10 + p
unused(p) = FALSE
IF i<9 THEN
CALL Try(i+1, suksesBerikut)
IF suksesBerikut = FALSE THEN
bil = bil \ 10
unused(p) = TRUE
END IF
ELSE
suksesBerikut = TRUE
END IF
END IF
LOOP UNTIL suksesBerikut = TRUE OR p = 9
sukses = suksesBerikut
END SUB

habis di bagi

sukses = false
bil = 0
CALL Try(1, sukses)
IF sukses=TRUE THEN
document.write "Bilangan yang Dicari adalah " & bil & "
"
ELSE
document.write "Tidak Ada Bilangan dengan Sifat Tersebut!!!
"
END IF

SUB Try(byVal i, byRef sukses)
p = 0
DO
p = p + 1
suksesBerikut = FALSE
IF (bil*10+p) MOD i = 0 THEN
bil = bil * 10 + p
IF i<9 THEN
CALL Try(i+1, suksesBerikut)
IF suksesBerikut = FALSE THEN
bil = bil \ 10
END IF
ELSE
suksesBerikut = TRUE
END IF
END IF
LOOP UNTIL suksesBerikut = TRUE OR p = 9
sukses = suksesBerikut
END SUB

eight queen papan

DIM x(8),a(8),b(15),c(15)

FOR i=1 TO 8
x(i)=0
a(i)=TRUE
NEXT

FOR i=1 TO 15
b(i)=TRUE
c(i)=TRUE
NEXT

sukses = false
CALL Try(1, sukses)
IF sukses=TRUE THEN
CALL CetakPapan()
ELSE
document.write "Tidak Ada Solusinya!!!
"
END IF

SUB Try(byVal baris, byRef sukses)
kolom = 0
DO
kolom = kolom + 1
suksesBerikut = FALSE
IF a(kolom) AND b(baris+kolom-1) AND c(kolom-baris+8) THEN
x(baris)=kolom
a(kolom)=FALSE
b(baris+kolom-1)=FALSE
c(kolom-baris+8)=FALSE
IF baris<8 THEN CALL Try(baris+1, suksesBerikut) IF suksesBerikut = FALSE THEN x(baris)=0 a(kolom)=TRUE b(baris+kolom-1)=TRUE c(kolom-baris+8)=TRUE END IF ELSE suksesBerikut = TRUE END IF END IF LOOP UNTIL suksesBerikut = TRUE OR kolom = 8 sukses = suksesBerikut END SUB SUB CetakPapan() document.write "Papan Catur :
"
document.write "" FOR i=1 TO 8 document.write "" FOR j=1 TO 8 IF j=x(i) THEN document.write "" ELSE document.write "" END IF NEXT document.write "" NEXT document.write "
Q  
"
END SUB

backtracking

DIM x(8),a(8),b(15),c(15)

FOR i=1 TO 8
x(i)=0
a(i)=TRUE
NEXT

FOR i=1 TO 15
b(i)=TRUE
c(i)=TRUE
NEXT

sukses = false
CALL Try(1, sukses)
IF sukses=TRUE THEN
CALL CetakPapan()
ELSE
document.write "Tidak Ada Solusinya!!!
"
END IF

SUB Try(byVal baris, byRef sukses)
kolom = 0
DO
kolom = kolom + 1
suksesBerikut = FALSE
IF a(kolom) AND b(baris+kolom-1) AND c(kolom-baris+8) THEN
x(baris)=kolom
a(kolom)=FALSE
b(baris+kolom-1)=FALSE
c(kolom-baris+8)=FALSE
IF baris<8 THEN CALL Try(baris+1, suksesBerikut) IF suksesBerikut = FALSE THEN x(baris)=0 a(kolom)=TRUE b(baris+kolom-1)=TRUE c(kolom-baris+8)=TRUE END IF ELSE suksesBerikut = TRUE END IF END IF LOOP UNTIL suksesBerikut = TRUE OR kolom = 8 sukses = suksesBerikut END SUB SUB CetakPapan() document.write "Papan Catur :
"
FOR i=1 TO 8
document.write x(i) & ", "
NEXT
document.write "
"
END SUB