费解的开关
思路:类似于熄灯问题:JAVA实现
import java.util.Scanner;
public class Main {
//用来遍历按钮四个方向,注意数组位置和在坐标系是不同的
//原地,左右上下
static int[] dx = { 0, 0, 0, -1, 1 };
static int[] dy = { 0, -1, 1, 0, 0 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char[][] light = new char[5][5];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
light[j] = sc.next().toCharArray();
}
System.out.println(work(light));
}
}
static int work(char[][] light) {
int min = Integer.MAX_VALUE;
char[][] map = new char[5][5];
for (int i = 0; i < (1 << 5); i++) {
for (int j = 0; j < 5; j++) {
for (int k = 0; k < 5; k++) {
//注意,JAVA对二维数组的clone是浅拷贝,即把数组地址公用,如果直接使用
//char[][] map=light.clone(),对这两个数组任意一个改变都会直接同时改变另一个的值
map[j][k] = light[j][k];
}
}
int res = 0;
for (int j = 0; j < 5; j++) {
if (((i >> j) & 1) == 1) {
res += 1;
turn(0, j, map);
}
}
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
if (map[j][k] == '0') {
res += 1;
turn(j + 1, k, map);
}
}
}
boolean isOK = true;
for (int j = 0; j < 5; j++) {
if (map[4][j] == '0') {
isOK = false;
break;
}
}
if (isOK) {
min = Math.min(res, min);
}
}
if(min>6) return -1;
return min;
}
private static void turn(int i, int j, char[][] map) {
for (int n = 0; n < 5; n++) {
int x = i + dx[n];
int y = j + dy[n];
if (x >= 0 && x < 5 && y >= 0 && y < 5) {
map[x][y] ^= 1;
}
}
}
}