AcWing 116. 飞行员兄弟
原题链接
简单
作者:
代码怎么敲
,
2024-02-24 02:25:59
,
所有人可见
,
阅读 123
import java.util.*;
public class Main{
static char[][] map=new char[4][4];
static char[][] backup=new char[4][4];
static int ans=Integer.MAX_VALUE;
static String end="";
static int get(int x,int y) {
return x*4+y;
}
static void turn_one(int x,int y) {
if(map[x][y]=='+')
map[x][y]='-';
else {
map[x][y]='+';
}
}
static void turn_all(int x,int y) {
for(int i=0;i<4;i++) {
turn_one(x,i);
turn_one(i,y);
}
turn_one(x,y);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
for(int i=0;i<4;i++) {
map[i]=scan.nextLine().toCharArray();
}
//枚举2^16种情况
for(int op=0;op<(1<<16);op++) {
//备份
for(int i=0;i<4;i++) {
backup[i]=map[i].clone();
}
int step=0;
String str="";
//枚举每一个开关
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++){
if((op>>get(i,j)&1)==1) {
step++;
str+=(i+1);
str+=(j+1);
turn_all(i,j);
}
}
}
//判断是否全亮
boolean has_closed=false;
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
if(map[i][j]=='+') {
has_closed=true;
break;
}
}
}
if(!has_closed) {
if(step<=ans) {
ans=step;
end=str;
}
}
//还原
for(int i=0;i<4;i++) {
map[i]=backup[i].clone();
}
}
System.out.println(ans);
for(int op=0;op<end.length();op+=2) {
System.out.println(end.charAt(op)+" "+end.charAt(op+1));
}
}
}