Bridged Marble Rings toj3069

Bridged Marble Rings toj3069
双向BFS
  1  #include < iostream >
  2  #include < map >
  3  #include < set >
  4  #include < vector >
  5  #include < deque >
  6  using   namespace  std;
  7  inline  int  adj( int  n)
  8  {
  9       int  dmin = n,i;
 10       int  tmp = ( 1 << 13 );
 11       for (i = 1 ;i < 13 ;i ++ )
 12      {
 13          n <<= 1 ;
 14           if (n & tmp)
 15          {
 16              n -= tmp;
 17              n |= 1 ;
 18          }
 19           if (dmin > n)
 20              dmin = n;
 21      }
 22       return  dmin;
 23  }
 24  inline  int  change( int  n, int  a, int  b)
 25  { // cout<<a<<" "<<b<<" ";
 26       int  i;
 27       for (i = 0 ;i < 3 ;i ++ )
 28      {
 29           if (a == 13 )a = 0 ;
 30           if (b == 26 )b = 13 ;
 31           int  t1 = (n >> a) & 1 ;
 32           int  t2 = (n >> b) & 1 ;
 33           if (t1 != t2)
 34          {
 35               if (t1 == 1 )
 36              {
 37                  n -= ( 1 << a);
 38                  n += ( 1 << b);
 39              }
 40               else
 41              {
 42                  n += ( 1 << a);
 43                  n -= ( 1 << b);
 44              }
 45          }
 46          a ++ ;
 47          b ++ ;
 48      }
 49       int  ans = 0 ;
 50      ans |= adj(n >> 13 ) << 13 ;
 51      ans |= adj(n & (( 1 << 13 ) - 1 ));
 52       return  ans;
 53  }
 54  int  main()
 55  {
 56       int  i,j,k;
 57       int  start = 0xE3FF ;
 58      vector < int > a;
 59      map < int , int   > Smap;
 60      Smap[start] = 1 ;
 61      Smap[( 1 << 13 ) - 1 ] = 0 ;
 62       int  tmp;
 63       for (i = 0 ;i < 13 ;i ++ )
 64           for (j = 13 ;j < 26 ;j ++ )
 65          {
 66              tmp = change(start,i,j);
 67              a.push_back(tmp);
 68               if (Smap.find(tmp) == Smap.end())
 69                  Smap[tmp] = 2 ;
 70          }
 71       for (k = 0 ;k < a.size();k ++ )
 72           for (i = 0 ;i < 13 ;i ++ )
 73               for (j = 13 ;j < 26 ;j ++ )
 74              {
 75                  tmp = change(a[k],i,j);
 76                   if (Smap.find(tmp) == Smap.end())
 77                  {
 78                      Smap[tmp] = 3 ;
 79                  }
 80              }
 81       char  ch[ 30 ];
 82       while (gets(ch) > 0 )
 83      {
 84          start = 0 ;
 85           for (i = 0 ;i < 26 ;i ++ )
 86          {
 87               if (ch[i] == ' y ' )
 88                  start |= 1 ;
 89              start <<= 1 ;
 90          }
 91          start >>= 1 ;
 92           int  tt = start;
 93          start = 0 ;
 94          start |= adj(tt & (( 1 << 13 ) - 1 ));
 95          start |= (adj(tt >> 13 )) << 13 ; // cout<<start<<"--------"<<tt<<endl;
 96          deque < int > q;
 97           set < int > Iset;
 98          q.push_back(start);
 99          q.push_back( 0 );
100           int  ans =- 1 ;
101           if (Smap.find(start) != Smap.end())
102              {
103                  ans = Smap[start];
104                   goto   out ;
105              }
106           while ( ! q.empty())
107          {
108               int  now = q.front();
109              q.pop_front();
110               int  cost = q.front();
111              q.pop_front();
112               for (i = 0 ;i < 13 ;i ++ )
113                   for (j = 13 ;j < 26 ;j ++ )
114                  {
115                      tmp = change(now,i,j);
116                       if (Smap.find(tmp) != Smap.end())
117                      {
118                          ans = cost + Smap[tmp] + 1 ;
119                           goto   out ;
120                      }
121                       if (Iset.find(tmp) == Iset.end())
122                      {
123                          Iset.insert(tmp);
124                          q.push_back(tmp);
125                          q.push_back(cost + 1 );
126                      }
127                  }
128          }
129           out :
130          printf( " %d\n " ,ans);
131      }
132  }

你可能感兴趣的:(Bridged Marble Rings toj3069)