AcWing 95. 费解的开关
原题链接
中等
作者:
岩_0
,
2025-03-13 21:30:01
·江苏
,
所有人可见
,
阅读 1
随便写写加深一下自己对这个题目的印象
//和y总的代码一模一样。。。
#include <bits/stdc++.h>
using namespace std;
char g[7][7];
int dx[] = {0, 1, 0, -1, 0};
int dy[] = {0, 0, 1, 0, -1};
void turn(int x, int y)
{
for (int i = 0; i < 5; i ++)
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < 5 && b >= 0 && b < 5)
g[a][b] ^= 1;
}
}
int solve()
{
int ans = 1e9;
for (int k = 0; k < 1 << 5; k ++)
{
int res = 0;
char backup[7][7];
memcpy(backup, g, sizeof(g));
for (int j = 0; j < 5; j ++)
{
if (k >> j & 1) //注意,k的某一位上为1不代表灯为开的状态,只是表示我们要按那盏灯,所以一共有32种情况
{
res ++;
turn(0, j);
}
}
for (int i = 0; i < 4; i ++)
{
for (int j = 0; j < 5; j ++)
{
if (g[i][j] == '0')
{
res ++;
turn(i + 1, j);
}
}
}
bool is_success = true;
for (int j = 0; j < 5; j ++)
{
if (g[4][j] == '0')
{
is_success = false;
break;
}
}
if (is_success) ans = min(ans, res);
memcpy(g, backup, sizeof(backup));
}
if (ans > 6) return -1;
else return ans;
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
for (int i = 0; i < 5; i ++) scanf("%s", g[i]);
int ans = solve();
printf("%d\n", ans);
}
}