Al ver esta pregunta, sabe que necesita enumerar violentamente y luego usar la enumeración binaria para representar el estado de la cruz correspondiente con un número entero, que es el poder de 2.
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <vector> 5 usando el espacio de nombres std; 6 7 int a [5] [5]; 8 int cambio [5] [5]; 9 int get ( int x, int y) { return x * 4 + y;} 10 int main () { 11 int state = 0; 12 para ( int i = 0; i <4; ++ i) 13 para ( intj = 0; j <4; ++ j) ( 14 char c; 15 cin >> c; 16 if (c == '+') 17 state + = 1 << get (i, j); // this Estado inicial 18 } 19 para ( int i = 0; i <4; ++ i) // utilizado para guardar el estado XOR 20 para ( int j = 0; j <4; ++ j) { 21 para ( int k = 0; k <4; ++ k) { 22 cambio [i] [j] + = 1 << get (i, k); 23 cambio [i] [j] + = 1 << get (k, j); 24 } 25 change [i] [j] - = 1 << get (i, j); // Suma dos veces y resta una vez 26 } 27 vector <par < int , int >> res; // Guarda la respuesta 28 para ( int i = 0; i <1 << 16; ++ i) { // Enumerar el estado 0101, 1 significa abrir, 0 significa abrir 29 int ahora = estado; 30 vector <par < int , int >> ruta; 31 para ( int j = 0; j <16; ++ j) 32 if (i >> j & 1) { // Recupere el jth número binario 33 int x = j / 4, y = j% 4; 34 ahora ^ = cambio [x] [y]; 35 path.push_back ({x, y}); 36 } 37 if (! Now && (res.empty () || res.size ()> path.size ())) res = ruta; 38 } 39 cout << res.size () << endl; 40 para ( auto i: res) cout << i.first + 1 << " " << i.second + 1 << endl; 41 devuelven 0; 42 }