tcbpg

Untitled

Sep 6th, 2011
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #include <map>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #define forn(i, n) for(int i = 0; i < (int) (n); i++)
  11. #define forsn(i, s, n) for(int i = (s); i < (int) (n); i++)
  12. #define dforn(i, n) for(int i = ((int)(n) -1 ); i >= 0; i--)
  13.  
  14. typedef pair<int, int> pint;
  15.  
  16. int P[3630000], cp;
  17. char D[3630000];
  18.  
  19. void decode(int perm, int arr[]){
  20.     forn(i, 10) arr[i] = i;
  21.  
  22.     bool app[10];
  23.     memset(app, 0, sizeof(app));
  24.  
  25.     dforn(i, 9){
  26.         arr[i] = perm % 10;
  27.         app[ arr[i] ] = true;
  28.  
  29.         perm = perm/10;
  30.     }
  31.  
  32.     forn(i, 10) if(!app[i]) arr[9] = i;
  33. }
  34.  
  35. int encode(int arr[]){
  36.     int perm = 0;
  37.     forn(i, 9){
  38.         perm = 10*perm + arr[i];
  39.     }
  40.  
  41.     return perm;
  42. }
  43.  
  44. int flip(int perm, int s, int e){
  45.     int arr[10], arrcp[10]; decode(perm, arr);
  46.     memcpy(arrcp, arr, sizeof(arr));
  47.  
  48.     forsn(i, s, e+1) arr[i] = arrcp[e+s-i];
  49.  
  50.     return encode(arr);
  51. }
  52.  
  53. int bsearch(int perm){
  54.     int l = 0, r = cp;
  55.  
  56.     while(r-l > 1){
  57.         int m = (l+r)/2;
  58.  
  59.         if(P[m] > perm) r = m; else l = m;
  60.     }
  61.  
  62.     return l;
  63. }
  64.  
  65. void calc(){
  66.     queue< pair<int, int> > Q;
  67.     Q.push(make_pair(0, 123456789));
  68.  
  69.     int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  70.     do{ P[cp] = encode(arr); D[ cp ] = -1; cp++; }while(next_permutation(arr, arr+10));
  71.  
  72.     while(!Q.empty()){
  73.         pint p = Q.front(); Q.pop();
  74.         int perm = p.second, d = p.first;
  75.  
  76.         if(d > 10) return;
  77.         if(D[ bsearch(perm) ] != -1) continue;
  78.         D[ bsearch(perm) ] = d;
  79.  
  80.         forn(i, 10)
  81.             forsn(j, i+1, 10)
  82.                 Q.push(make_pair(d+1, flip(perm, i, j)));
  83.  
  84.         }
  85. }
  86.  
  87. int main(){
  88. #ifdef ACM
  89.     freopen("test.in", "r", stdin);
  90. #endif
  91.  
  92.     char s[16], t[16];
  93.  
  94.     calc();
  95.     while(scanf("%s %s\n", s, t) && strcmp(s, "*")){
  96.         int n = 0, m = 0;
  97.  
  98.         forn(i, 9){
  99.             n = 10*n + (s[i] - 'a');
  100.             m = 10*m + (t[i] - 'a');
  101.         }
  102.  
  103.         int pn = D[ bsearch(n) ], pm = D[ bsearch(m) ];
  104.         printf("%d\n", max(pn, pm)-min(pn, pm));
  105.     }
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment