585 - Triangles

All about problems in Volume 5. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

daniloj
New poster
Posts: 2
Joined: Fri May 27, 2011 9:41 pm

Re: 585 - Triangles

Post by daniloj »

Hi everybody. I've been submitting and trying to refine this code but so far it solves all cases I give it and i can't find what's wrong with it. OJ has been giving me verdict of WA even though it outputs just like the sample says.
i've also tried many inputs from forum responses and all have been correct.

anybody see what's missing?

Code: Select all

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

int niveles=0;

void buscar_triangulo_abajo(char **m, int fila, int columna)
{
	int j,cont=0;
	if (m[fila][columna]=='-')
	{
		for (j=0-niveles;j<=niveles;j++)
		{
			if (m[fila][columna+j]=='-') cont++;
		}
		if (cont==(2*niveles+1))
		{
			niveles++;
			buscar_triangulo_abajo(m,fila+1,columna);
		}
	}
}

void buscar_triangulo_arriba(char **m, int fila, int columna)
{
	int j,cont=0;	
	if (m[fila][columna]=='-')
	{
		for (j=0-niveles;j<=niveles;j++)
		{
			if (m[fila][columna+j]=='-') cont++;
		}
		if (cont==(2*niveles+1))
		{
			niveles++;
			buscar_triangulo_arriba(m,fila-1,columna);
		}
	}
}


int mayordelos2(int a, int b)
{
	if (a>b) return a;
	else return b;
}


int main()
{
	char **m;
	int n,i,j,area1=0,area2=0,area,contador=0;
	

	while (scanf("%i\n",&n)==1)
	{
		area1=0;area2=0;
		if (n==0)
		{
			break;
		}
		else
		{
			m = malloc((n+2) * sizeof(char *));
			for (i=0;i<(n+2);i++)
			{
				m[i]=malloc((2*n-1) * sizeof(char));
				if (i>0 && i<(n+1))	gets(m[i]);
			else for (j=0;j<(2*n-1);j++) m[i][j]='#';
			}
		
			for (i=1;i<(n+1);i++)
			{
				for(j=i;j<(2*n-1-i);j=j+2)
				{
					niveles=0;
					buscar_triangulo_abajo(m,i,j);
					if (niveles>area1) area1=niveles;
				}
			}
			
			for (i=n;i>0;i--)
			{
				for(j=(i-1);j<(2*n-i);j=j+2)
				{
					niveles=0;
					buscar_triangulo_arriba(m,i,j);
					if (niveles>area2) area2=niveles;
				}
			}
			
			
			for (i=0; i<(n+2); i++)
				free (m[i]);
			free (m);
			m=NULL;
			
			contador++;
			if(contador>1)
			{
				printf("\n");
			}
			area=mayordelos2(area1,area2);
			printf("Triangle #%i\n",contador);
			printf("The largest triangle area is %i.\n",area*area);
		}
	}
	return 0;
}
daniloj
New poster
Posts: 2
Joined: Fri May 27, 2011 9:41 pm

Re: 585 - Triangles

Post by daniloj »

hello again... if anybody's reading this :)
I found some errors and found my code wasn't taking cases without spaces very well.
Now this one does but am still getting WA.
Please if anybody could check it to see if i'm missing something.

Code: Select all

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

int niveles=0;

void buscar_triangulo_abajo(char **m, int fila, int columna)
{
	int j,cont=0;
	if (m[fila][columna]=='-')
	{
		for (j=0-niveles;j<=niveles;j++)
		{
			if (m[fila][columna+j]=='-') cont++;
		}
		if (cont==(2*niveles+1))
		{
			niveles++;
			buscar_triangulo_abajo(m,fila+1,columna);
		}
	}
}

void buscar_triangulo_arriba(char **m, int fila, int columna)
{
	int j,cont=0;	
	if (m[fila][columna]=='-')
	{
		for (j=0-niveles;j<=niveles;j++)
		{
			if (m[fila][columna+j]=='-') cont++;
		}
		if (cont==(2*niveles+1))
		{
			niveles++;
			buscar_triangulo_arriba(m,fila-1,columna);
		}
	}
}


int mayordelos2(int a, int b)
{
	if (a>b) return a;
	else return b;
}


int main()
{
	char **m;
	int n,i,j,area1=0,area2=0,area,contador=0;
	

	while (scanf("%i",&n)==1)
	{
		scanf("\n");
		area1=0;area2=0;
		if (n==0)
		{
			break;
		}
		else
		{
			m = malloc((n+2) * sizeof(char *));
			for (i=0;i<(n+2);i++)
			{
				m[i]=malloc((2*n-1) * sizeof(char));
				if (i==0 || i==(n+1))
				{
					for (j=0;j<(2*n-1);j++) m[i][j]='#';
				}
				else
				{
					for (j=0;j<(2*n-1);j++) m[i][j]='+';
				}


			}
			
			for (i=1; i<(n+1); i++)
			{
				for (j=i-1; j<(2*n-i); j++)
				{
					scanf("%c\n",&m[i][j]);
				}
			}
					
			
			for (i=1;i<(n+1);i++)
			{
				for(j=i;j<(2*n-1-i);j=j+2)
				{
					niveles=0;
					buscar_triangulo_abajo(m,i,j);
					if (niveles>area1) area1=niveles;
				}
			}
			
			for (i=n;i>0;i--)
			{
				for(j=(i-1);j<(2*n-i);j=j+2)
				{
					niveles=0;
					buscar_triangulo_arriba(m,i,j);
					if (niveles>area2) area2=niveles;
				}
			}
			
			
			for (i=0; i<(n+2); i++)
				free (m[i]);
			free (m);
			m=NULL;
			
			
			contador++;
			if(contador>1)
			{
				printf("\n");
				printf("\n");
			}
			area=mayordelos2(area1,area2);
			printf("Triangle #%i\n",contador);
			printf("The largest triangle area is %i.",area*area);
			
		}
	}
	printf("\n");
	return 0;
}

by the way, uvatoolkit's solution of this problem is wrong.
Post Reply

Return to “Volume 5 (500-599)”