Ir ao conteúdo
  • Cadastre-se
eliumoraes

Exercício dando erro

Recommended Posts

Boa noite amigos do fórum,

 

Mais uma vez estou com dúvidas, prova quase chegando (sábado agora 21) e eu me matando pra fazer coisas simples. O código abaixo dá 70% de WA no URI:

 

#include <stdio.h>

int main(int argc, char const *argv[])
{
	int i,r,g,b,p,x,c;
	char u,o,k[3];

	scanf("%d",&c);
	
	for(x=0;x<c;x++){

		scanf("%d",&p);
		r=g=b=0;
		for(i=0;i<p;i++){
			scanf(" %[^\n]s",k);
			u = k[0];
			o = k[2];

		//	printf("%c %c\n",u,o );
			switch(u){
				case 'R':
					if (o=='G'){
						r = r + 2;
					}
					else r++;
					break;
				case 'G':
					if (o=='B'){
						g = g + 2;
					}
					else g++;
					break;
				case 'B':
					if (o=='R'){
						b = b + 2;
					}
					else b++;
					break;
			}

		}

	if(r==b && r==g){ //Verifica se as três variáveis são iguais
		printf("trempate\n");
	}
	else{
		if(r==g && r>b){ //verifica se duas são iguais e maiores que a outra
			printf("empate\n");
		}
		else{
			if(b==g && b>r){ //verifica se duas são iguais e maiores que a outra
				printf("empate\n");
			}
			else{
				if(r>g && r>b){ //verifica se red é maior que todas
					printf("red\n");
				}
				else{
					if(g>b && g>r){ //verifica se green é maior que todas
						printf("green\n");
					}
					else printf("blue\n"); //se nenhum dos casos anteriores é verdadeiro então blue é maior que todas
				}
			}
		}
		
	}

	}

	return 0;
}

O mais estranho é que todas as respostas batem com as saídas que o URI pede. O exercício em questão é esse aqui. Alguém saberia me indicar o que fiz de errado? O que eu devo focar pra melhorar meus conhecimentos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@eliumoraes modifiquei umas coisas e compilei como .cpp e o URI aceitou:

 

#include <cstdio>
#include <iostream>

using namespace std;

int main(int argc, char const *argv[]) {
  int i,r,g,b,p,x,c;

  scanf("%d",&c);

  for(x=0; x<c; x++) {

    scanf("%d",&p);

    r = 0;
    g = 0;
    b = 0;
    for(i=0; i<p; i++) {
      char o, u, lixo;

      cin.ignore();
      scanf("%c%c%c", &u, &lixo, &o);
      // printf("i: %d | p: %d | u: %c | o: %c\n", i, p, u, o);

      switch(u) {
      case 'R':
        if (o=='G') {
          r = r + 2;
        } else r++;
        break;
      case 'G':
        if (o=='B') {
          g = g + 2;
        } else g++;
        break;
      case 'B':
        if (o=='R') {
          b = b + 2;
        } else b++;
        break;
      }

    }

    if(r==b && r==g) { //Verifica se as três variáveis são iguais
      printf("trempate\n");
    } else {
      if(r==g && r>b) { //verifica se duas são iguais e maiores que a outra
        printf("empate\n");
      } else {
        if(b==g && b>r) { //verifica se duas são iguais e maiores que a outra
          printf("empate\n");
        } else {
          if(r>g && r>b) { //verifica se red é maior que todas
            printf("red\n");
          } else {
            if(g>b && g>r) { //verifica se green é maior que todas
              printf("green\n");
            } else printf("blue\n"); //se nenhum dos casos anteriores é verdadeiro então blue é maior que todas
          }
        }
      }

    }

  }

  return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CiroboyBR Pelo que entendi você mudou poucas coisas, por exemplo você adicionou uma função pra limpar o buffer de entrada, mudou a entrada para três %c em vez do %s, jogando o segundo numa variável lixo e desceu a criação das variáveis lá pra baixo.

 

Eu tentei fazer a mesma coisa, porém em C, mantendo as alterações que você fez e melhorou um pouco, mas ainda está dando 50% de WA. No "if else" eu acho que você não mudou nada, nem no "switch", exceto a identação.

 

Ficou assim:

 

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

int main(int argc, char const *argv[])
{
	int i,r,g,b,p,x,c;
	char j,u,o,k[3];

	scanf("%d",&c);
	
	for(x=0;x<c;x++){

		scanf("%d",&p);
		r = 0;
		g = 0;
		b = 0;
		for(i=0;i<p;i++){
		//	setbuf(stdin,NULL);
			fflush(stdin);
   			__fpurge(stdin);
			scanf("%c%c%c",&u,&j,&o);
			//scanf(" %[^\n]s",k);
			//u = k[0];
			//o = k[2];

		//	printf("%c %c\n",u,o );
			switch(u){
				case 'R':
					if (o=='G'){
						r = r + 2;
					}
					else {r++;}
					break;
				case 'G':
					if (o=='B'){
						g = g + 2;
					}
					else {g++;}
					break;
				case 'B':
					if (o=='R'){
						b = b + 2;
					}
					else {b++;}
					break;
			}

		}

	if(r==b && r==g){ //Verifica se as três variáveis são iguais
		printf("trempate\n");
	}
	else{
		if(r==g && r>b){ //verifica se duas são iguais e maiores que a outra
			printf("empate\n");
		}
		else{
			if(b==g && b>r){ //verifica se duas são iguais e maiores que a outra
				printf("empate\n");
			}
			else{
				if(r>g && r>b){ //verifica se red é maior que todas
					printf("red\n");
				}
				else{
					if(g>b && g>r){ //verifica se green é maior que todas
						printf("green\n");
					}
					else printf("blue\n"); //se nenhum dos casos anteriores é verdadeiro então blue é maior que todas
				}
			}
		}
		
	}

	}

	return 0;
}	

Sobre a limpeza do buffer em c eu encontrei esses três:

 

		  	setbuf(stdin,NULL);
			fflush(stdin);
   			__fpurge(stdin)

Pelo que vi para limpar em Windows deve usar o fflush e em Linux o __fpurge, eu tentei só com o setbuf ou com os outros dois ali. Não consegui encontrar nenhuma outra mudança significativa, tirando as bibliotecas e a linguagem é claro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×