$$\color{Red}{飞行员兄弟}$$
这里附带打个广告——————我做的所有的题解
包括基础提高以及一些零散刷的各种各样的题
思考
此题可以先看注释,不懂得可以问我,我看到回复,日后复习到它我写详细的证明
import java.util.*;
import java.io.*;
public class Main {
static int N = 5;
static char g[][] = new char [N][N];
static char backup[][] = new char [N][N];
public static class Pii {
int x, y;
public Pii(int x, int y){
this.x = x;
this.y = y;
}
}
public static int get(int x, int y){
return 4 * x + y;
}
public static void turn_one(int x, int y){
if (g[x][y] == '+') g[x][y] = '-';
else g[x][y] = '+';
}
public 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) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<4; i++)
g[i] = br.readLine().toCharArray();
//还原原型的备份数组
for(int i=0; i<4; i++) backup[i] = g[i].clone();
// 存储最终方案的操作
List <Pii> res = new ArrayList<Pii>();
// 枚举所有方案
for(int op=0; op < 1<<16; op++){
// 存储待定答案数组
List <Pii> temp = new ArrayList<Pii>();
// 枚举16个位置按方案的情况进行操作
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if((op >> get(i, j) & 1) == 1){
// 加入temp队列 并打开相应行列开关
// 这里加1因为答案坐标是从1开始
temp.add(new Pii(i+1, j+1));
turn_all(i, j);
}
// 判断灯泡是否全部全亮
boolean dark = false;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if (g[i][j] == '+'){
dark = true;
break;
}
if (!dark)
if (res.isEmpty() || temp.size() < res.size()) res = temp;
// 每个op使用过后需要把g变回最初的样子
for(int i=0; i<4; i++) g[i] = backup[i].clone();
}
// 没说无解可猜想必定有解
System.out.println(res.size());
for(int i=0; i<res.size(); i++)
System.out.println(res.get(i).x + " " + res.get(i).y);
}
}
兄弟能不能帮忙看看我这哪里错了