Das Josephus-Problem

Das Josephus-Problem ist eine alte Denkaufgabe: Eine Anzahl Gefangene (z.B. 41) wird in einem Kreis aufgestellt und dann wird abgezählt: Immer nach einer bestimmten Zahl, z.B. immer beim Dritten, wird der Kopf abgeschlagen. Dies geht so lange im Kreis der noch Verbliebenen herum, bis nur noch einer übrig bleibt. Die Frage ist nun, wo muss ich mich hinstellen, damit ich als Letzte überlebe?
Es gibt unzählige Lösungen für dieses Problem in diversen Programmiersprachen, hier ist meine Lösung in Groovy:

 

k = 3  //Immer der k. wird geköpft
n = 41 //Anzahl Gefangene
//Alle Gefangenen im Kreis, true = lebt, false = tot
kreis = [true] * n //Array mit n boolschen Werten
println kreis
pos = -1 
anzFalse = 0
//die Schleife läuft, solange es noch mehr als 1 Überlebenden gibt
while (anzFalse < n) {
  for (int counter = 0; counter < k; counter++) {
    pos = pos + 1
    //wenn die nächsten schon tot sind, werden sie übersprungen
    while (!kreis [pos.mod(n)]) {
      pos = pos + 1
    }
    //den Gefangenen an dieser Position trifft es
    if (counter == k - 1) {
      kreis[pos.mod(n)] = false
      anzFalse = anzFalse + 1
      //das ist der Letzte
      if (anzFalse == n) {
        println ((pos.mod(n) + 1) + " überlebt")    
      } else {
        println ((pos.mod(n) + 1) + " ist tot")
      }
    }
  }
}

Der Kreis wird durch einen Array of boolean dargestellt. Wenn die Person an der jeweiligen Position im Array lebt, dann ist der Wert true, ansonsten false. Nun wird in einer Schleife abgezählt. Immer nach k Schritten trifft es einen Gefangenen. Ab der zweiten Runde werden diejenigen übersprungen, die bereits tot sind. Die Variable pos läuft immer weiter, mit pos.mod(n) wird wieder vorne begonnen, wenn die letzte Position erreicht worden ist.

Comments are closed.