public static Result josephus(int N, int K, int S) { // TODO: usando los metodos definidos en el Circurlar Linked List, // implementa una solucion al problema de Flavio Josefo // // Debes simular el juego con los parametros N, K y S: // * Tenemos N personas paradas alrededor de un circulo, donde N es la // cantidad de personas al inicio del juego. Para identificacion, // cada persona es numerada desde 1 a N, en orden de la manecilla // del reloj. // * En el inicio, la persona #1 es ejecutada. // * A partir de ahi, ejecutan a cada K persona (es decir, brincamos K-1 // personas). // * La simulacion se repite hasta que queden S sobrevivivientes, // quienes decidir no seguir jugando este macabro juego. // // Devuelve un objeto de la clase Result, donde: // a) el atributo execution_order contiene el orden de ejecucion de las // personas aniquilidas en el proceso // b) el atributo survisors contiene una lista de los sobrevivientes // (en cualquier orden) // // Ejemplo: Para N=41, K=3 y S=2: // execution_orden = { // 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 3, 8, 12, // 17, 21, 26, 30, 35, 39, 5, 11, 18, 24, 32, 38, 6, 15, 27, 36, // 9, 23, 41, 20, 2, 33 // } // survivors = { 14, 29 } // // Asume que los parametors N, K, S tienen valores validos // // // Complejidad esperada: O(N*K) en worst-case // Valor: 5 puntos int cantidadVictimas = N - S; Result res = new Result(); res.execution_order = new int[cantidadVictimas]; res.survivors = new int[S]; if (N == S) { for (int n = 0; n < N; n++) { res.survivors[n] = n + 1; } return(res); } CLinkedList circuloDeLaMuerte = new CLinkedList(); for (int n = 1; n <= N; n++) { circuloDeLaMuerte.add(n); } res.execution_order[0] = 1; circuloDeLaMuerte.locate(1); circuloDeLaMuerte.remove(); for (int m = 1; m < cantidadVictimas; m++) { circuloDeLaMuerte.moveTo(K - 1); res.execution_order[m] = circuloDeLaMuerte.get(); circuloDeLaMuerte.remove(); } for (int s = 0; s < S; s++) { res.survivors[s] = circuloDeLaMuerte.get(); circuloDeLaMuerte.moveTo(-1); } return(res); }