注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。
数据范围
1≤i,j≤4
输入样例:
-+--
----
----
-+--
输出样例:
6
1 1
1 3
1 4
4 1
4 3
4 4
解题思路:
先将4*4的16个格子中所有可能出现的情况枚举一次,接着按照枚举的方案对灯泡进行操作,最后判断是否满足条件。
Java代码:
import java.io.*;
public class Main {
static char [][]s = new char[4][4];
static char [][]temp = new char[4][4];
static StringBuilder ansStep = new StringBuilder();
static StringBuilder res = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0; i < 4; i++) {
String str = br.readLine();
for(int j = 0; j < 4; j++) {
s[i][j] = str.charAt(j);
}
}
int ans = Integer.MAX_VALUE;
for(int op = 0; op < 1 << 16; op++) {//比用四个for清晰
for(int i = 0; i < 4; i++) {//在备份数组上操作
for(int j = 0; j < 4; j++) {
temp[i][j] = s[i][j];
}
}
int step = 0;
res = new StringBuilder();
for(int i = 0; i < 4; i++) {//两个for是为了得出数组整体的相对位置pos
for(int j = 0; j < 4; j++) {
int pos = i * 4 + j;//将二维坐标一维化的编号
if((op >> pos & 1) == 1) {
step++;
turn_all(i, j);
res.append((i + 1) + " " + (j + 1) + "\n");
}
}
}
boolean flag = true;//检查
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
if(temp[i][j] == '+')
flag = false;
}
}
if(flag) {
if(ans > step) {
ans = step;
ansStep = res;
}
}
}
System.out.println(ans);
System.out.print(ansStep);
}
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 turn_one(int x, int y) {
if(temp[x][y] == '+') {
temp[x][y] = '-';
}else {
temp[x][y] = '+';
}
}
}