Friday, 6 November 2015

Algoritma dan Source Code Josephus Problem dengan Linked Link

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);    }

}

}