// Executa o Problema de Josephus. void executaJosephus(TListaCirc* lista) { // Verifica se a lista está vazia if(!verificaCircVazio(lista)) { int tamanho = verificaQteSoldados(lista); if(tamanho == 1) { printf("Existe apenas um Soldado, então, %s deverá montar no cavalo e escapar", lista->dado); } else { TListaCirc* soldadoAnterior = lista; int contador = 0; inicializaRand(); int numeroSorteado = sorteiaNumero(); TListaCirc* soldadoSorteado = sorteiaSoldado(lista); printf("Número sorteado: %d\n", numeroSorteado); printf("Soldado sorteado para iniciar a contagem: %s\n", soldadoSorteado->dado); printf("#############################################################\n\n"); while(tamanho > 1) { contador = 0; printf("Soldados no círculo: %d\n", tamanho); do { soldadoAnterior=soldadoSorteado; soldadoSorteado = soldadoSorteado->proxima; if (++contador == numeroSorteado) { if (soldadoSorteado == lista) { lista = soldadoSorteado->proxima; } printf("O soldado %s foi retirado do círculo\n", soldadoSorteado->dado); soldadoAnterior->proxima = soldadoSorteado->proxima; // reinicia contagem com o Soldado seguinte lista = soldadoSorteado->proxima; printf("Contagem iniciará à partir do soldado %s\n\n", lista->dado); free(soldadoSorteado); soldadoSorteado = lista; tamanho = verificaQteSoldados(lista); } } while(contador != numeroSorteado); }; printf("#############################################################\n"); printf("Como o soldado %s é o único restante, ele deverá montar no cavalo e escapar", lista->dado); } } else { printf("Nenhum soldado no círculo\n"); } }
// Retorna um Soldado aleatório dentre os disponíveis na Lista. TListaCirc* sorteiaSoldado(TListaCirc *lista) { TListaCirc* aux = lista; int totalSoldados = verificaQteSoldados(aux); if(totalSoldados > 1) { int cont = 0; int numeroSorteado; numeroSorteado = sorteiaNumero(totalSoldados); while(++cont < numeroSorteado) { aux = aux->proxima; } } return aux; }
int main(void) { TListaCirc *listaC; listaC = inicializa(); listaC = insereSoldadoNoCirc(listaC, "BATMAN"); listaC = insereSoldadoNoCirc(listaC, "SPIDERMAN"); listaC = insereSoldadoNoCirc(listaC, "SUPERMAN"); listaC = insereSoldadoNoCirc(listaC, "IRONMAN"); listaC = insereSoldadoNoCirc(listaC, "WONDER WOMAN"); listaC = insereSoldadoNoCirc(listaC, "CAPTAIN AMERICA"); listaC = insereSoldadoNoCirc(listaC, "GREEN LANTERN"); listaC = insereSoldadoNoCirc(listaC, "HULK"); printf("Soldados\n"); printf("-------------------------\n"); imprimeSoldadosCirc(listaC); printf("Quantidade de Soldados: %d\n", verificaQteSoldados(listaC)); printf("-------------------------\n"); executaJosephus(listaC); return EXIT_SUCCESS; }
int main(void) { // ======================= // Inserção de soldados // ======================= // Escolhe um número srand(time(0)); // Declaração de variáveis int i; SLista* listax = inicializa(); // Propósito de testes char nomes[5][20] = { "Joao", "Arthur", "Davi", "Joaquim", "Eduardo" }; // Insere os 5 soldados na lista // e imprime a lista com os soldados inseridos. for (i = 0; i < 5; i++) listax = insereSoldadoNoCirc(listax, nomes[i], (i+1)); // Quantidade de soldados na lista int quantidade = verificaQteSoldados(listax); //printf("\nQuantidade de Soldados: %d\n\n", quantidade); // ======================= // Execução de Josephus // ======================= listax = executaJosephus(listax, quantidade); // Imprime printf("\nSoldado a executar a tarefa:\n"); imprimeSoldadosCirc(listax); return EXIT_SUCCESS; }