注意点
1.在开关函数中,变了两次要再变一次
2.res(最终结果)要初始最大值,题目挑最小操作数
private static char[][] g=new char[4][4];//操作的开关图
private static char[][] backup=new char[4][4];//存储输入状态
private static String end="";//存储操作总步骤,例:最小操作数是只按1 1,即end="11";
private static int res=0x3f3f3f3f;//存储最终操作次数
public static void open(int a,int b) {//操作开关
for(int i=0;i<4;i++) {
if(g[i][b]=='+')
g[i][b]='-';
else g[i][b]='+';
}
for(int i=0;i<4;i++) {
if(g[a][i]=='+')
g[a][i]='-';
else g[a][i]='+';
}
if(g[a][b]=='+')//变了两次要变回来
g[a][b]='-';
else g[a][b]='+';
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
for(int i=0;i<4;i++)
backup[i]=scanner.next().toCharArray();
for(int op=0;op<(1<<16);op++) {//由于有16个开关相当于有16位二进制位,每个有0,1选择。共有2^16-1个操作方案
int step=0;
String str="";
for(int j=0;j<4;j++)
g[j]=backup[j].clone();//属于深拷贝
for(int i=0;i<16;i++) {
if((op>>i&1)==1) {//若是1则操作
int x=i/4;//将一维的变到二维下标
int y=i%4;//x代表行,y代表列
open(x,y);
str+=x;str+=y;//存储操作下标
step++;
}
}
boolean flag=true;
for(int i=0;i<g.length;i++) {
for(int j=0;j<g[i].length;j++) {
if(g[i][j]=='+') {//若操作完后开关没全部打开则舍弃掉
flag=false;
break;
}
}
}
if(flag) {
if(step<res) {//将碰到更小的操作方案则进行更新
res=step;
end=str;
}
}
}
System.out.println(res);
for(int i=0;i<end.length();i++) {
int a=end.charAt(i)-47;
int b=end.charAt(i+1)-47;
System.out.println(a+" "+b);
i++;
}
}