Ranking (as of 2015-11-17): 2 out of 493
Language: C++
/*
UVa 418 - Molecules
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_418_Molecules.cpp
*/
#include <algorithm>
#include <cstdio>
using namespace std;
const int nr_permutations = 24, nr_chains = 4, nr_elements = 12;
char molecules[nr_chains][nr_elements + 1];
const int orders[nr_permutations][nr_chains] = {
{0, 1, 2, 3}, {0, 1, 3, 2}, {0, 2, 1, 3}, {0, 2, 3, 1},
{0, 3, 1, 2}, {0, 3, 2, 1}, {1, 0, 2, 3}, {1, 0, 3, 2},
{1, 2, 0, 3}, {1, 2, 3, 0}, {1, 3, 0, 2}, {1, 3, 2, 0},
{2, 0, 1, 3}, {2, 0, 3, 1}, {2, 1, 0, 3}, {2, 1, 3, 0},
{2, 3, 0, 1}, {2, 3, 1, 0}, {3, 0, 1, 2}, {3, 0, 2, 1},
{3, 1, 0, 2}, {3, 1, 2, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}
};
int main()
{
while (true) {
scanf("%s", molecules[0]);
if (molecules[0][0] == 'Q')
break;
for (int i = 1; i < nr_chains; i++)
scanf("%s", molecules[i]);
int area = 0;
for (int p = 0; p < nr_permutations; p++) {
const char *vertical_left = molecules[orders[p][0]],
*horizontal_up = molecules[orders[p][1]],
*vertical_right = molecules[orders[p][2]],
*horizontal_down = molecules[orders[p][3]];
for (int i = 1; i < nr_elements - 1; i++)
for (int j = 1; j < nr_elements - 1; j++) {
if (vertical_left[i] != horizontal_up[j])
continue;
for (int jj = j + 2; jj < nr_elements - 1; jj++)
for (int k = 1; k < nr_elements - 1; k++) {
if (horizontal_up[jj] != vertical_right[k])
continue;
for (int ii = i + 2; ii < nr_elements - 1; ii++)
for (int l = 1; l < nr_elements - 1; l++) {
if (vertical_left[ii] != horizontal_down[l])
continue;
int kk = k + ii - i, ll = l + jj - j;
if (kk > 0 && kk < nr_elements - 1 &&
ll > 0 && ll < nr_elements - 1 &&
vertical_right[kk] == horizontal_down[ll]) {
area = max(area, (ii - i - 1) * (jj - j - 1));
}
}
}
}
}
printf("%d\n", area);
}
return 0;
}
No comments:
Post a Comment