题目
解释
- 改变一个灯的状态就会改变上下左右的状态
- 考虑到只有5*5的矩阵,采用暴力加贪心的模拟算法
- 第一行的灯进行操作的开关情况只有2^5=32种
- 将32种操作分别进行一次贪心遍历,如果最后一行没有暗的灯则输出结果
代码段
#include<iostream>
#include<vector>
using namespace std;
vector<vector<char>>a(5, vector<char>(5));
vector<vector<char>>b(5, vector<char>(5));
const int N = 6;
int dx[N] = { -1, 0, 1, 0, 0 }, dy[N] = { 0, 1, 0, -1, 0 };
void turn(int x,int y)
{
for (int i = 0; i < 5; i++)
{
int a = x + dx[i], b1 = y + dy[i];
//如果在边界外边,直接忽略即可
if (a < 0 || a >= 5 || b1< 0 || b1 >= 5) continue;
b[a][b1] ^= 1; //异或,不同的时候就变成相反的数
}
}
int main()
{
int n; cin >> n;
while (n--)
{
for(int i=0;i<5;i++)
for (int j = 0; j < 5; j++)
cin >> a[i][j];
int res = 1e5;
for (int op = 0; op < 32; op++)
{
b = a;
int step = 0;
for (int i = 0; i < 5; i++)
{
if (op >> i & 1)
{
step++;
turn(0, i);
}
}
for (int i =0 ; i < 4; i++)
for (int j = 0; j < 5; j++)
if (b[i][j] == '0')
{
step++;
turn(i+1, j);
}
bool dark = 0;
for (int j = 0; j < 5; j++)
if (b[4][j] == '0')
{
dark = 1;
break;
}
if (!dark)res = min(res, step);
}
if (res > 6)res = -1;
cout << res << endl;
}
}