Jump to content

[Resolvido] Dúvida em jogo do círculo


andrebm
 Share

Recommended Posts

Olá, tenho um exercício para resolver:

Considere o seguinte jogo: n pessoas, numeradas de 1 a n são dispostas num círculo. Começando na 2ª pessoa, vamos removendo do círculo “pessoa-sim, pessoa-não” e o círculo aperta-se. O jogo termina quando resta apenas uma pessoa.

Por exemplo, para n = 10 a ordem das eliminações é: 2, 4, 6, 8, 10, 3, 7, 1, 9 e 5 é o sobrevivente. Escreva um programa em Pascal que leia n e escreva a ordem das eliminações e o sobrevivente de acordo com este algoritmo.

A minha duvida é oque eu devo usar para soluciona-lo, andei pesquisando sobre fila circular e não sei se esse é o caminho correto, por favor me digam se devo continuar nesse caminho ou dicas de alguma forma para solucionar o exercício.

Link to comment
Share on other sites

Boas,

existe varias maneiras, uma delas seria criar um array com os numeros de 1 a n e ir removendo os elementos, ou trocar por zero (acho que fica mais simples)

- repete
   - de i=1 a n (ciclo for)
    - se array(i) não for 0, soma 1 ao contador
    - se o contador MOD 2 for 0 e o array(i) não for 0, adiciona ao eliminados, incrementa o nr de eliminados (se não usar array para guardar os eliminados) e seta o array(i) = 0
   - fim do ciclo for
- até o nr de eliminados ser igual a n (fim do ciclo repete)

o sobrevivente é o ultimo do eliminados

  • Vote 1
Link to comment
Share on other sites

Entendi o que o código faz porem não sei implementar um array de 1 até n.

Tentei da seguinte forma:

var vet: array[1..n] of integer;

Então o programa avisa que n não foi declarado, e se eu declarar n antes ele diz que a constante é inválida.

Obrigado pela atenção.

Deixo abaixo o corpo do programa que fiz:

cont:=0;
nume:=0;
writeln ('digite o numero de participantes');
readln (n);
for i:=1 to n do
begin
vet1[i]:=i;
end;
repeat
for i:=1 to n do
begin
if vet1[i] <> 0 then
begin
    cont:=cont+1;
end;
if (cont mod 2 = 0) and (vet1[i]<>0) then
begin
    vet2[i]:=vet1[i];
    vet1[i]:=0;
    nume:=nume+1;
end;
end;
until nume=n;
Edited by thoga31
GeSHi
Link to comment
Share on other sites

Para o array não podes definir na sua declaração que vai até n no caso de n ser uma variável (var) e não uma constante (const).

Repara que o programa vai precisar de reservar espaço em memória RAM para o array e, para isso, tem de saber desde logo quantos elementos são. Portanto, o limite não pode ser jamais uma variável.

Existe uma forma de contornar esta situação, mas para agora não considero aconselhado abordar.

A solução é definires um limite máximo para o array, pelo que vais ter de igual forma controlar o input do utilizador de forma a não ultrapassar esse limite.

const MAX = 100;

var lista : array[1..MAX] of integer;

//...
repeat
  readln(n);
until (n >= 1) and (n <= MAX);
Edited by thoga31
  • Vote 1

Knowledge is free!

Link to comment
Share on other sites

Ae, vou deixar mais ou menos como ficou pra ele ir eliminando a partir de n pessoas;

const max = 100;
var vet: array[1..max] of integer;
Begin
cont:=0;
nume:=0;
writeln ('digite o numero de participantes');
readln (n);
for i:=1 to n do
begin
vet[i]:=i;
end;
repeat
for i:=1 to n do
begin
if vet[i] <> 0 then
begin
    cont:=cont+1;
end;
if (cont mod 2 = 0) and (vet[i]<>0) then
begin
    vetr[i]:=vet[i];
    vet[i]:=0;
    nume:=nume+1;
end;
end;
until nume=n;
End.
Edited by thoga31
GeSHi
Link to comment
Share on other sites

o indice do array onde estas a guardar os eliminados não pode ser i

vetr[i]:=vet[i];

assim o que estas a fazer é uma copia do array vet, tens aí uma variavel boa para te servir de indice (está fora de ordem)

Edited by vikcch
Link to comment
Share on other sites

o indice do array onde estas a guardar os eliminados não pode ser i

vetr[i]:=vet[i];

assim o que estas a fazer é uma copia do array vet, tens aí uma variavel boa para te servir de indice (está fora de ordem)

Fiz esta copia do array pois futuramente no código acrescentei mais um array que armazena como estava o contador quando o participante foi eliminado, e então organizei o array copiado junto ao array de contadores em ordem crescente (para o contador), para que fosse possível mostrar a ordem dos eliminados.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.