$$\color{Red}{费解的开关——JAVA—详解}$$
我的网站=> 分享了我关于前后端的各种知识和生活美食~
我于Acwing平台分享的零散刷的各种各样的题
证明
有点懒 这里这道题我复习的时候把思路再补充吧
java
import java.util.*;
import java.io.*;
public class Main {
static int N = 6;
static char g[][] = new char [N][N];
static char back[][] = new char [N][N];
static int dx[] = {-1, 0, 1, 0, 0};
static int dy[] = {0, 1, 0, -1, 0};
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void turn(int x, int y) {
for(int i=0; i<5; i++){
int a = x + dx[i];
int b = y + dy[i];
// 这里利用了'0'和'1'的ASCII码的位数一个是0一个是1可以通过位运算转化
if(a>=0 && a<5 && b>=0 && b<5) g[a][b] ^= 1;
}
}
public static void main(String [] args) throws IOException {
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
int res = 7;
for(int i=0; i<5; i++)
g[i] = br.readLine().toCharArray();
//把空行读入
br.readLine();
// 第一行的32种状态
for(int op=0; op< 1<< 5; op++) {
//数组备份
for(int i=0; i<5; i++) back[i] = g[i].clone();
int step = 0;
//第一行的32种状态
for(int i=0; i<5; i++)
if((op >> i & 1) == 0){
step ++;
turn(0, i);
}
//按第一行的状态从第二行开始按 一直按到最后一行
for(int i=0; i<4; i++)
for(int j=0; j<5; j++)
if(g[i][j] == '0'){
step ++;
turn(i+1, j);
}
boolean dark = false;
//检查最后一行是否有灭的灯泡
for(int j=0; j<5; j++)
if (g[4][j] == '0'){
dark = true;
break;
}
if(!dark) res = Math.min(res, step);
// 恢复现场
for(int i=0; i<5; i++) g[i] = back[i].clone();
}
if(res > 6) res = -1;
System.out.println(res);
}
}
}