思路:枚举第一行每个位置按与不按,得到32种第一行的情况,对于每种情况,递推(上一行的是0,那正下方一行同个位置需要点亮),最后一行判断是不是点亮,判断当前方案是否有解,有解则维护最小解。
char mp[6][6];
char nw[6][6];
int dx[] = {1,0,-1,0,0};
int dy[] = {0,1,0,-1,0};
void change(int x,int y)
{
f(i, 0, 4)
{
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 1 && nx <= 5 && ny >= 1 && ny <= 5)
nw[nx][ny] ^= 1;
}
}
int work()
{
int ans = 0x3f3f3f3f;
f(i, 0, (1 << 5) - 1)
{
int res = 0;
memcpy(nw, mp, sizeof mp);
f(j, 0, 4)
if (i >> j & 1)
{
res++;
change(1, j+1);
}
f(j, 1, 4)
f(k, 1, 5)
if (nw[j][k] == '0')
{
res++;
change(j + 1, k);
}
int fg = 0;
f(j, 1, 5)if (nw[5][j] == '0')fg = 1;
if (!fg)ans = min(ans, res);
}
if (ans > 6)ans = -1;return ans;
}
int main()
{
cin >> t;
while (t--)
{
f(i, 1, 5)scanf("%s", mp[i]+1);
cout << work() << endl;
}
return 0;
}