看懂讲的课还是很简单的
这个有一个疑问就是第一行如何计算按了几盏灯, 这个的话枚举的是第一行如何点灯而不是点灯后的状态
所以根据二进制来判断有几个一就按几次, 二进制的每一位是从零开始枚举的
import java.util.*;
public class Main {
static int N = 10, n;
static int[][] p = new int[N][N];
static int[] x = {-1, 0, 1, 0, 0}, y = {0, 1, 0, -1, 0};
public static void turn(int l, int r)
{
for (int i = 0; i < 5; i ++ )
p[l + x[i]][r + y[i]] = 1 - p[l + x[i]][r + y[i]];
}
public static void slove()
{
int ans = 100010;
for (int C = 0; C < 1 << 5; C ++)
{
int t = C;
int[][] h = new int[N][N];
for (int i = 1; i <= 5; i ++ )
for (int j = 1; j <= 5; j ++ )
h[i][j] = p[i][j];
int res = 0;
for (int i = 0; i < 5; i ++ ) // 第一行枚举如何点灯
{
if (((t >> i) & 1) == 1)
{
res ++;
turn(1, 5 - i); // 对应二进制的位置
}
}
for (int i = 2; i <= 5; i ++ ) // 之后是枚举上一行的状态
{
for (int j = 1; j <= 5; j ++ )
{
if (p[i - 1][j] == 0)
{
res ++;
turn(i, j);
}
}
}
boolean flag = true;
for (int i = 1; i <= 5; i ++ )
if (p[5][i] != 1) flag = false;
if (flag) ans = Math.min(ans, res);
for (int i = 1; i <= 5; i ++ )
for (int j = 1; j <= 5; j ++ )
p[i][j] = h[i][j];
}
if (ans > 6) System.out.println(-1);
else System.out.println(ans);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = Integer.parseInt(sc.nextLine());
while (n -- != 0)
{
for (int i = 1; i <= 5; i ++ )
{
String ch = sc.nextLine();
for (int j = 1; j <= 5; j ++ )
{
p[i][j] = (int)(ch.charAt(j - 1) - '0');
}
}
String temp = "";
if (n != 0)
temp = sc.nextLine();
slove();
}
}
}