Page 2 of 2

Re: 585 - Triangles

Posted: Mon Jun 13, 2011 12:22 am
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;
}

Re: 585 - Triangles

Posted: Tue Jun 14, 2011 6:04 pm
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.