① 枚举所有开关的状态(0~2^16 - 1)(16位二进制数,若某一位为1表示按一下,为0表示不按)
② 按照该方案,对所有灯泡进行操作(所在行,所在列全部按一下)
③ 判断灯泡是否全亮,如果全亮的话,记录方案
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 5;
char g[N][N], backup[N][N];
int get(int x, int y)
{
return 4 * x + y;
}
void turn(int x, int y)
{
if (g[x][y] == '+') g[x][y] = '-';
else g[x][y] = '+';
}
void turn_all(int x, int y)
{
for (int i = 0; i < 4; ++ i)
{
turn(x, i);
turn(i, y);
}
turn(x, y);
}
int main()
{
for (int i = 0; i < 4; ++ i) scanf("%s", g[i]);
vector<PII> res;
for (int op = 0; op < (1 << 16); ++ op)
{
vector<PII> temp;
memcpy(backup, g, sizeof(g));
for (int i = 0; i < 4; ++ i)
{
for (int j = 0; j < 4; ++ j)
{
if (op >> (get(i, j)) & 1)
{
temp.push_back({i, j});
turn_all(i, j);
}
}
}
bool has_off = false;
for (int i = 0; i < 4; ++ i)
for (int j = 0; j < 4; ++ j)
if (g[i][j] == '+')
{
has_off = true;
break;
}
if (!has_off)
{
if (res.empty() || res.size() > temp.size()) res = temp;
}
memcpy(g, backup, sizeof(backup));
}
printf("%d\n", res.size());
for (auto op : res) printf("%d %d\n", op.first + 1, op.second + 1);
return 0;
}