Josephus Problem adalah suatu masalah pengeksekusimatian terpidana – terpidana mati pada jaman dahulu kala. Sebenarnya ini bisa dianalogikan dengan jenis permainan anak – anak.
Berikut adalah penjelasan Josephus Problem dengan pendekatan permainan anak – anak yang sejenis :
Ada sebuah permaian yang dilakukan oleh (n) orang secara melingkar. Permainan itu adalah membilang bilangan dari 1 – (r). Barangsiapa memperoleh girilan untuk membilang bilangan r, dia akan kalah dan tidak boleh ikut permainan lagi. Setelah itu penghitungan dilanjtkan mulai dari 1 oleh orang setelahnya. Penghitungan pertama dimulai di player ke-(st). Permainan akan berakhir jika dan hanya jika ada satu orang yang tidak kalah.
Algoritma Dasar :
– Melakukan penghitungan dimulai dari player ke-n
– Penghitungan dilanjutkan ke player sebelah kanannya (player.next)
– Jika mencapai player ke-n, dilanjutkan dengan player pertama (circular)
– Jika hitungan sudah mencapai range yang telah ditentukan, lakukan proses remove. Player.next dituju ke player sebelah kanan dari player yang tereliminasi. Begitu seterusnya sampai First = Last (tinggal 1 player).
Berikut adalah souce code penyelesaian Josephus Problem dengan menggunakan konsep linked list :
import java.util.ArrayList;import java.util.List; public class Josephus { public static void main(String[] args) { int captiveNumber = 7; int startFrom = 1; int runStep = 4; CaptiveList list = new CaptiveList(startFrom, captiveNumber, runStep); Link lastOne = list.runGame(); System.out.println("The survival: " + lastOne); } private static class CaptiveList { private Link dynamicHead; private int runStep; public CaptiveList(int startFrom, int captiveNumber, int runStep) { this.runStep = runStep; Link previous = null; Link head = null; for (int i = 1; i <= captiveNumber; i++) { Link tmpLink = new Link(i); if (previous == null) head = tmpLink; else previous.next = tmpLink; previous = tmpLink; if (i == startFrom) dynamicHead = tmpLink; } previous.next = head; } private Link suicide() { Link current = dynamicHead; Link previous = null; int testPos = runStep; while (--testPos >= 1) { previous = current; current = current.next; } if (previous == current.next) previous.next = null; else previous.next = current.next; dynamicHead = current.next; return current; } public Link runGame() { List killed = new ArrayList(); while (dynamicHead != null && dynamicHead.next != null) killed.add(suicide()); for (int i = 0; i < killed.size(); i++) { Link kill = (Link) killed.get(i); System.out.println("Killing: " + kill); } return dynamicHead; } } private static class Link { private int number; public Link next; public Link(int number) { this.number = number; } public String toString() { return String.valueOf(number); } } } |