Ranking (as of 2015-10-20): 18 out of 815
Language: C++
/*
UVa 11464 - Even Parity
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11464_Even_Parity.cpp
*/
#include <cstdio>
const int N_max = 15;
int N, min_count, cells[N_max][N_max], transformations[N_max][N_max];
void transformation(int c, int count)
{
if (c == N) {
for (int i = 0; i < N - 1; i++)
for (int j = 0; j < N; j++) {
int p = 0;
if (i)
p += transformations[i - 1][j];
if (j)
p += transformations[i][j - 1];
if (j < N - 1)
p += transformations[i][j + 1];
transformations[i + 1][j] = (p & 1) ? 1 : 0;
if (!transformations[i + 1][j] && cells[i + 1][j]) // transformation of 1 to 0
return;
else if (transformations[i + 1][j] != cells[i + 1][j]) {
if (++count >= min_count)
return;
}
}
min_count = count;
#ifdef DEBUG
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
printf("%d%c", transformations[i][j], ((j < N - 1) ? ' ' : '\n'));
printf("%d %d\n", count, min_count);
#endif
}
else {
int cc = cells[0][c];
transformations[0][c] = cc;
transformation(c + 1, count);
if (!min_count)
return;
if (!cc && count + 1 < min_count) {
transformations[0][c] = 1;
transformation(c + 1, count + 1);
}
}
}
int main()
{
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
scanf("%d", &N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
scanf("%d", &cells[i][j]);
min_count = N * N + 1;
transformation(0, 0);
printf("Case %d: %d\n", t, ((min_count > N * N) ? -1 : min_count));
}
return 0;
}
No comments:
Post a Comment