和poj 1753基本类似,深搜暴力枚举就好,开两个数组记录路径就好
#include<iostream>
#include<vector>
using namespace std;
int c = 17;
int board[4][4];
int x1[20], y1[20], x[20], y[20]; // x1, y1临时路径, x, y最终路径
void read() {
char c;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
cin >> c;
if (c == '-') {
board[i][j] = 0;
} else {
board[i][j] = 1;
}
}
}
}
void turn(int x, int y) { // 翻转(x, y)
if (x >= 0 && x < 4 && y >= 0 && y < 4) {
board[x][y] = !board[x][y];
}
}
void flip(int s) { // 按题意翻转一行和一列
int x = s / 4;
int y = s % 4;
turn(x, y);
for (int i = 0; i < 4; i++) {
turn(i, y);
turn(x, i);
}
}
int finish() { // 判断是否全为'-'
int sum = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
sum += board[i][j];
}
}
if (sum) {
return 0;
} else {
return 1;
}
}
void DFS(int pos, int num) { // 深搜,pos当前位置,num已翻转数量
if (finish()) { // 全为'-'
if (num < c) { // 记录更小翻转数及路径
c = num;
for (int i = 0; i < c; i++) {
x[i] = x1[i];
y[i] = y1[i];
}
}
return;
}
if (pos >= 16) { // 所有格子都搜过
return;
}
DFS(pos + 1, num); // 当前格子不翻转
flip(pos);
x1[num] = pos / 4 + 1; //记录路径
y1[num] = pos % 4 + 1;
DFS(pos + 1, num + 1); // 翻转当前格子
flip(pos); // 深搜还原
}
int main() {
read();
DFS(0, 0);
cout << c << endl;
for (int i = 0; i < c; i++) {
cout << x[i] << " " << y[i] << endl;
}
}