Ir ao conteúdo
  • Cadastre-se

Exercício dando erro


eliumoraes

Posts recomendados

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?

Link para o comentário
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
Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...