AcWing 95. 费解的开关(Java)
原题链接
中等
作者:
j简单
,
2021-02-13 18:08:03
,
所有人可见
,
阅读 449
import java.util.Scanner;
import java.lang.Math;
public class Main{
static int N = 5;
static char g[][] = new char[N][N];
static char backup[][] = new char [N][N];
static int dx[] = {-1, 0, 1, 0, 0};
static int dy[] = {0, 1, 0, -1, 0};
public static 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) continue;
g[a][b] ^=1; // 异或 字符'0' <---> '1'
}
}
public static void main(String [] args) throws Exception{
//BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
while( n-- >0 ){
//reader.next()自动忽略掉空行
for(int i = 0; i < 5; i++) backup[i] = reader.next().toCharArray();
int res = 10;
//每行5位 每位有0/1两种状态 对应10进制的0~31
//枚举对第一行的所有可能操作 每一位的0表示不摁 1表示摁 ,如11111 表示全摁,00000表示全不摁
//每对第一行进行操作要事先备份
for(int op = 0; op < 32; op ++){
//对g数组进行备份
for(int k = 0; k < 5; k ++)
for(int q =0; q < 5; q++)
g[k][q] = backup[k][q];
int step = 0;
for(int i = 0; i < 5; i++){
int u = op >> i & 1;
if( u ==1 ){
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);
}
if(res > 6) res = -1;
System.out.println(res);
}
}
}
static int dx[] = {-1, 0, 1, 0, 0};
static int dy[] = {0, 1, 0, -1, 0};
这两个为啥要这么定义嘞?
这是定义x、y的增量的。分别是上右下左四个方向的增量。