フライングブラザーズ[バイナリ列挙+ XOR]

画像



この質問を見ると、激しく列挙し、バイナリ列挙を使用して、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 forint i = 0; i <4; ++ i)
 13 forint 
                       j = 0; j <4; ++ j)(
 14              char c;
 15              cin >> c;
 16              if(c == '+')
 17                  state + = 1 << get(i、j); //これ開始状態
18          }
 19      forint i = 0; i <4; ++ i)// XOR状態の保存に使用
20          forint j = 0; j <4; ++ j){
 21              forint 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 < intint >>パス;
 31          forint 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      forauto i:res)cout << i.first + 1 << "  " << i.second + 1 << endl;
41は      0を返します。
42 }

おすすめ

転載: www.cnblogs.com/rstz/p/12711996.html