この質問を見ると、激しく列挙し、バイナリ列挙を使用して、2のべき乗である整数で対応する十字の状態を表す必要があることがわかります。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <vector> 5 名前空間 std を使用 。 6 7 int a [5] [5]; 8 int change [5] [5]; 9 int get(int x、int y){ return x * 4 + y;} 10 int main(){ 11 int state = 0; 12 for(int i = 0; i <4; ++ i) 13 for(int j = 0; j <4; ++ j)( 14 char c; 15 cin >> c; 16 if(c == '+') 17 state + = 1 << get(i、j); //これ開始状態 18 } 19 for(int i = 0; i <4; ++ i)// XOR状態の保存に使用 20 for(int j = 0; j <4; ++ j){ 21 for(int k = 0; k <4; ++ k){ 22 change [i] [j] + = 1 << get(i、k); 23 change [i] [j] + = 1 << get (k、j); 24 } 25 変更[I] [J] - = GET << 1(I、J); //二回減算を追加する 26のある } 27 ベクトル<ペア< int型、int型 >> RES; //はに対する回答を保存する 28 のために(int型 i = 0; i <1 << 16; ++ i){ //状態0101を列挙し、1は開くことを意味し、0は開くことを意味する 29 int now =状態; 30 ベクトル<pair < int、int >>パス; 31 for(int j = 0; j <16; ++ j) 32 if(i >> j&1){ // j番目の2進数を取得する 33 int x = j / 4、y = j%4; 34 今^ =変更[x] [y]; 35 パス.push_back({x、y}); 36 } 37 if(!now &&(res.empty()|| res.size()> path.size()))res = path; 38 } 39 cout << res.size()<< endl; 40 for(auto i:res)cout << i.first + 1 << " " << i.second + 1 << endl; 41は 0を返します。 42 }