Advertisement
Guest User

Untitled

a guest
Sep 8th, 2013
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <stack>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <string>
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <functional>
  13. using namespace std;
  14.  
  15. int p, dist[5050], par[5050];
  16. map<int, int> shortCode;
  17. vector<int> longCode, g[5050];
  18.  
  19. int vertex(char *s) {
  20.     int code = 0;
  21.     for (int i = 0; i < 7; i++)
  22.         code = code * 10 + (s[i] == '0' ? 0 : s[i] - 'A' + 1);
  23.     map<int, int>:: iterator r = shortCode.find(code);
  24.     if (r != shortCode.end())
  25.         return r->second;
  26.     longCode.push_back(code);
  27.     shortCode.insert(make_pair(code, longCode.size() - 1));
  28.     return longCode.size() - 1;
  29. }
  30.  
  31. void buildEdges(char *s) {
  32.     int z, e1 = -1, e2 = -1, e3 = -1;
  33.     for (z = 0; s[z] != '0'; z++);
  34.     switch (z) {
  35.         case 0: e1 = 1; e2 = 5; break;
  36.         case 1: e1 = 0; e2 = 2; e3 = 6; break;
  37.         case 2: e1 = 1; e2 = 3; break;
  38.         case 3: e1 = 2; e2 = 4; break;
  39.         case 4: e1 = 3; e2 = 5; e3 = 6; break;
  40.         case 5: e1 = 0; e2 = 4; break;
  41.         case 6: e1 = 1; e2 = 4; break;
  42.     }
  43.     int v = vertex(s);
  44.     swap(s[z], s[e1]); 
  45.     g[v].push_back(vertex(s));
  46.     swap(s[z], s[e1]);
  47.     swap(s[z], s[e2]);
  48.     g[v].push_back(vertex(s));
  49.     swap(s[z], s[e2]);
  50.     if (e3 != -1) {
  51.         swap(s[z], s[e3]);
  52.         g[v].push_back(vertex(s));
  53.         swap(s[z], s[e3]);
  54.     }
  55. }
  56.  
  57. char movedLetter(int v1, int v2) {
  58.     int state1 = longCode[v1], state2 = longCode[v2];
  59.     while (state1 % 10 != 0) {
  60.         state1 /= 10;
  61.         state2 /= 10;
  62.     }
  63.     return 'A' - 1 + state2 % 10;
  64. }
  65.  
  66. int main() {
  67.     //freopen("input.txt", "r", stdin);
  68.     //freopen("output.txt", "w", stdout);
  69.  
  70.     char s[10] = "ABCDEF0";
  71.     sort(s, s + 7);
  72.     buildEdges(s);
  73.     while (next_permutation(s, s + 7))
  74.         buildEdges(s);
  75.  
  76.     queue<int> q;
  77.     for (int i = 0; i < 5050; i++)
  78.         dist[i] = par[i] = -1;
  79.     dist[vertex("ABCDEF0")] = 0;
  80.     q.push(vertex("ABCDEF0"));
  81.     while (!q.empty()) {
  82.         int v = q.front();
  83.         q.pop();
  84.         for (int i = 0; i < g[v].size(); i++) {
  85.             if (dist[g[v][i]] == -1) {
  86.                 par[g[v][i]] = v;
  87.                 dist[g[v][i]] = dist[v] + 1;
  88.                 q.push(g[v][i]);
  89.             }
  90.         }
  91.     }
  92.  
  93.     scanf("%d", &p);
  94.     for (int tst = 1; tst <= p; tst++) {
  95.         scanf("%*d %s", s);
  96.         int v = vertex(strcat(s, "0"));
  97.         if (dist[v] == -1) {
  98.             printf("%d NO SOLUTION\n", tst);
  99.             continue;
  100.         }
  101.         printf("%d %d ", tst, dist[v]);
  102.         while (par[v] != -1) {
  103.             printf("%c", movedLetter(v, par[v]));
  104.             v = par[v];
  105.         }
  106.         printf("\n");
  107.     }
  108.    
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement