[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Desafio
- Subject: Desafio
- From: "Lennon Machado" <lennonx@hotmail.com>
- Date: Tue, 09 Mar 1999 02:50:08 PST
Prof. Yoshi,
Andei pensando sobre o desafio e tenho a seguinte ideia:
1-implementar um vetor de inteiros com os numeros de todas as pessoas
2-implementar uma lista que aponta para o numero da pessoa viva e para a
proxima pessoa viva
3-se m>numero de pessoas vivas seria necessario dar uma ou mais voltas
completas no circulo de pessoas restante, porem basta saber o resto da
divisao de m pelo numero de pessoas vivas para saber quantos passos
andar.
4-calcular o indice da pessoa a ser assassinada por:
indice_proximo=resto da divisao de (indice_atual+numero_de_passos(item
3)-1) por numero_de_pessoas_vivas
Ex:
n=8 m=4
|------------------------------
\/ |
lista: p1->p2->p3->p4->p5->p6->p7->p8-
| | | | | | | |
\/ \/ \/ \/ \/ \/ \/ \/
numeracao: 1 2 3 4 5 6 7 8
apos uma iteracao:
|------------------------------
\/ |
lista: p1->p2->p3----->p5->p6->p7->p8-
| | | | | | |
\/ \/ \/ \/ \/ \/ \/
numeracao: 1 2 3 4 5 6 7 8
Ate que nao haja mais sobreviventes.
Eis o programa:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct aponta aponta, *ptr_aponta;
struct aponta
{
int* pessoa;
ptr_aponta prox;
};
int main(void)
{
int m,n,indice,ct;
int* numeracao;
ptr_aponta lista,proc;
char opcao[3];
do
{
printf("\nQuantas pessoas participarao do genocidio ? (maximo
2000)\n");
gets(opcao);
sscanf(opcao,"%d",&n);
printf("\nQual o passo de contagem para a execucao ?\n");
gets(opcao);
sscanf(opcao,"%d",&m);
if((m<=0)||(n<=0)||(n>2000))
printf("\nAssim nao tem graca...\n");
else
{
if(!(numeracao=(int*)malloc(n*sizeof(int))) ||
!(lista=(ptr_aponta)malloc(n*sizeof(aponta))))
printf("\nNao ha memoria suficiente para %d pessoas\n",n);
else
{
for(indice=0;indice<=n;indice++)
{
*(numeracao+indice)=indice;
(lista+indice)->pessoa=numeracao+indice;
(lista+indice)->prox=lista+indice+1;
}
(lista+indice-1)->prox=lista;
printf("\nPara %d pessoas, com passo %d, temos :\n",n,m);
indice=1;
while(n)
{
if(!(indice=(indice+m%n-1)%n))
indice=n;
for(proc=lista,ct=0;ct<indice-1;ct++)
proc=proc->prox;
printf("%d, ",*((proc->prox)->pessoa));
proc->prox=(proc->prox)->prox;
n--;
}
}
printf("\n");
}
free(numeracao);
free(lista);
printf("\nDeseja Continuar (Qualquer tecla=Sim / N=Nao) : ");
gets(opcao);
}while((opcao[0]!='n')&&(opcao[0]!='N'));
return(0);
}
Tambem tentei deixar o laco for mais inteligente, mas realizei medidas
de tempo para situacoes semelhantes e para 0<n<2001 e m>0 nao causou
beneficios, pelo contrario, aumento em quase 1 segundo o tempo de
execucao do algoritmo:
printf("\nPara %d pessoas, com passo %d, temos :\n",n,m);
indice=1;
proc=lista->prox;
ct=1;
while(n)
{
if(!(indice=(indice+m%n-1)%n))
indice=n;
if(ct>indice-1)
{
proc=lista;
ct=0;
}
for(;ct!=indice-1;ct=++ct%n)
proc=proc->prox;
printf("%d, ",*((proc->prox)->pessoa));
proc->prox=(proc->prox)->prox;
n--;
}
Qual a opiniao sobre o programa ? Melhorias ? Criticas ? Sugestoes ?
Lennon Machado
3/3/99 11h05min
retransmitido em
9/3/99 7h50min
______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com