예제 #1
0
    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);
    }