AcWing 95. 费解的开关
原题链接
中等
作者:
不知名路人
,
2021-04-11 10:04:06
,
所有人可见
,
阅读 276
import java.util.Scanner;
public class Main {
static int N=6;
static int n;
static char[][] a=new char[N][N];
static char[][] b=new char[N][N];//保存原数组
static int[] dx={-1,0,1,0,0};
static int[] dy={0,1,0,-1,0};
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
n=in.nextInt();
while (n--!=0){
//读入
for(int i=0;i<5;i++){
a[i]=in.next().toCharArray();
}
int res=10;
//对于每种情况遍历
for(int op=0;op<32;op++){
//保存一下原数组
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
b[i][j]=a[i][j];
}
}
//记录步数
int step=0;
//开始旋转第一行
for(int i=0;i<5;i++){
int t=op>>i&1;
if(t==1){
step++;
turn(0,i);//第0行第i个机关
}
}
//下面三行
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
if(a[i][j]=='0'){
step++;
turn(i+1,j);
}
}
}
//最后一行
boolean fa=false;
for(int i=0;i<5;i++){
if(a[4][i]=='0'){
fa=true;
break;
}
}
if(!fa)
res=Math.min(res,step);
//复原数组
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
a[i][j]=b[i][j];
}
}
}
if(res>6)
res=-1;
System.out.println(res);
}
}
private static void turn(int x, int y) {
for(int i=0;i<5;i++){
int k=x+dx[i];
int l=y+dy[i];
if(k<0||k>=5||l<0||l>=5){
continue;
}
a[k][l]^=1;
}
}
}