// 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;
}
Пример #4
0
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;
}