题意
传送门 POJ 2965
题解
枚举 2 16 2^{16} 216 种可能的开关选取方法,对满足条件的方法更新答案即可。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int sw[4][4], tmp[4][4], tx[16], ty[16], rx[16], ry[16];
char str[4][4];
int main()
{
for (int i = 0; i < 4; ++i)
{
scanf(" %s", str[i]);
for (int j = 0; j < 4; ++j)
sw[i][j] = str[i][j] == '+' ? 1 : 0;
}
int res = 17;
for (int s = 0; s < (1 << 16); ++s)
{
memcpy(tmp, sw, sizeof(sw));
int cnt = 0, r[4] = {0}, c[4] = {0};
for (int k = 0; k < 16; ++k)
if (s >> k & 1)
{
int i = k >> 2, j = k & 3;
tx[cnt] = i, ty[cnt] = j;
++cnt;
tmp[i][j] ^= 1;
r[i] ^= 1, c[j] ^= 1;
}
int f = 0;
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
f |= tmp[i][j] ^ r[i] ^ c[j];
if (!f && cnt < res)
{
res = cnt;
for (int i = 0; i < cnt; ++i)
rx[i] = tx[i], ry[i] = ty[i];
}
}
printf("%d\n", res);
for (int i = 0; i < res; ++i)
printf("%d %d\n", rx[i] + 1, ry[i] + 1);
return 0;
}