Flying Brothers [Enumeración binaria + XOR]

imagen



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 }

Supongo que te gusta

Origin www.cnblogs.com/rstz/p/12711996.html
Recomendado
Clasificación