Ranking (as of 2013-07-20): 326 out of 890
Language: C++
Used brute-force search.
/*
UVa 585 - Triangles
To build using Visual Studio 2010:
cl -EHsc -O2 UVa_585_Triangles.cpp
*/
#include <algorithm>
#include <cstdio>
using namespace std;
const int n_max = 100;
char triangles[n_max][n_max * 2];
int largest_triangle(int n, int ti, int tj)
{
int nr = 0;
for (int k = 1; ti < n; k++, ti++) {
if (tj - k < ti + 1 || tj + k > 2 * n - ti - 3)
return nr;
for (int j = tj - k; j <= tj + k; j++)
if (triangles[ti][j] != '-')
return nr;
nr += 2 * k + 1;
}
return nr;
}
int largest_inverted_triangle(int n, int ti, int tj)
{
int nr = 0;
for (int k = 1; ti >= 0; k++, ti--) {
if (tj - k < ti || tj + k > 2 * n - ti - 2)
return nr;
for (int j = tj - k; j <= tj + k; j++)
if (triangles[ti][j] != '-')
return nr;
nr += 2 * k + 1;
}
return nr;
}
int main()
{
for (int nr = 1; ; nr++) {
int n;
scanf("%d", &n);
getchar(); // skip '\n'
if (!n)
break;
for (int i = 0; i < n; i++)
gets(triangles[i]);
int largest = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1, jh = 2 * n - i - 1; j < jh; j += 2)
if (triangles[i][j] == '-')
largest = max(largest, 1 + largest_triangle(n, i + 1, j));
for (int i = n - 1; i >= 0; i--)
for (int j = i, jh = 2 * n - i - 1; j < jh; j += 2)
if (triangles[i][j] == '-')
largest = max(largest, 1 + largest_inverted_triangle(n, i - 1, j));
printf("Triangle #%d\nThe largest triangle area is %d.\n\n", nr, largest);
}
return 0;
}
No comments:
Post a Comment