quarta-feira, 24 de outubro de 2018

URI PROBLEMA 1110 - Jogando Cartas Fora SOLUÇÃO EM C

URI Online Judge | 1110

Jogando Cartas Fora

Folclore, adaptado por Piotr Rudnicki  Canada
Timelimit: 1
Dada uma pilha de n cartas enumeradas de 1 até n com a carta 1 no topo e a carta n na base.  A seguinte operação é ralizada enquanto tiver 2 ou mais cartas na pilha.
Jogue fora a carta do topo e mova a próxima carta (a que ficou no topo) para a base da pilha.
Sua tarefa é encontrar a sequência de cartas descartadas e a última carta remanescente.
Cada linha de entrada (com exceção da última) contém um número n ≤ 50. A última linha contém 0 e não deve ser processada. Cada número de entrada produz duas linhas de saída. A primeira linha apresenta a sequência de cartas descartadas e a segunda linha apresenta a carta remanescente.

Entrada

A entrada consiste em um número indeterminado de linhas contendo cada uma um valor de 1 até 50. A última linha contém o valor 0.

Saída

Para cada caso de teste, imprima duas linhas. A primeira linha apresenta a sequência de cartas descartadas, cada uma delas separadas por uma vírgula e um espaço. A segunda linha apresenta o número da carta que restou. Nenhuma linha tem espaços extras no início ou no final. Veja exemplo para conferir o formato esperado.



#include <stdio.h>
#include <stdlib.h>

typedef struct lista{
int info;
struct lista *prox;
}Lista;

typedef struct fila{
Lista *ini;
Lista *fim;
}Fila;

Fila *inicialize(){
Fila *prim = (Fila*)malloc(sizeof(Fila));
prim->ini = NULL;
prim->fim = NULL;
return prim;
}

void *push(Fila *p, int carta){
Lista *novo = (Lista*)malloc(sizeof(Lista));
novo->info = carta;
novo->prox = NULL;
if(p->ini==NULL){
p->ini = novo;
p->fim = novo;
}else{
p->fim->prox = novo;
p->fim = novo;
}

}

int pop(Fila *p){
int carta;
Lista *l;

l = p->ini;
carta = l->info;

p->ini = l->prox;
if(p->ini==NULL)
p->fim = NULL;

free(l);

return carta;
}

int vazio(Fila *p){
return p->ini==NULL;
}

int main(){

int n, i, carta, cont = 0;
Fila *fila;

fila = inicialize();

do{
scanf("%d", &n);
if(n){
cont = n;
for(i=1;i<=n;i++){
push(fila, i);
}

printf("Discarded cards:");

while(cont!=1){
printf(" %d", pop(fila));
push(fila, pop(fila));

if(cont!=2)
printf(",");
cont--;
}

if(!vazio(fila))
printf("\nRemaining card: %d\n", pop(fila));
}
}while(n!=0);

return 0;
}

Nenhum comentário:

Postar um comentário

URI PROBLEMA 1133 - Resto da Divisão SOLUÇÃO EM C

URI Online Judge | 1133 Resto da Divisão Adaptado por Neilor Tonin, URI   Brasil Timelimit: 1 Escreva um programa que leia 2 valo...