费解的开关,Java版,着实让人费解
数据拷贝用Arrays.copyOf()时,当数组元素是对象,Java默认浅拷贝,即只拷贝对象的引
用。
解决办法:一个一个元素地拷贝
还有我位运算op>>i时,把i写成1了,检查了半天死活检查不出来哪里错了,离谱!!
所以平时书写时候认真一些
Java样例
import java.util.*;
public class Main {
static int[] dx = {-1,0,1,0,0};
static int[] dy = {0,1,0,-1,0};
static char[][] g;
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;
}
if(g[a][b]=='0') {
g[a][b]='1';
}else {
g[a][b]='0';
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
g = new char[5][5];
char[][] backup = new char[5][5];
while(n-->0) {
sc.nextLine();
// 读入第一组数据
for(int i=0;i<5;i++) {
g[i]=sc.nextLine().toCharArray();
backup[i]=Arrays.copyOf(g[i], 5);
}
int res=10;
for(int op=0;op<32;op++) {
int step=0;
//操作第一行
for(int i=0;i<5;i++){
//如果是1的话就操作一下
//op某一位是1代表要对这个格子进行操作,0表示不需要进行操作
if(((op>>i)&1)==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 i=0;i<5;i++) {
if(g[4][i]=='0') {
dark = true;
break;
}
}
if(!dark) {
res = Math.min(res, step);
}
for(int i=0;i<5;i++) {
g[i]=Arrays.copyOf(backup[i],5);
}
}
if(res>6) res=-1;
System.out.println(res);
}
}
}