Advertisement
Guest User

Untitled

a guest
May 1st, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. char grid[12][12], buffer[12][12];
  6. map<string, int> visited;
  7. map<string, string> parents;
  8.  
  9. string grid_to_str(void) {
  10.     char str[12];
  11.     int k = 0;
  12.     for(int i = 1; i <= 3; ++i)
  13.         for(int j = 1; j <= 3; ++j)
  14.             str[k++] = buffer[i][j];
  15.     str[k] = 0;
  16.     return str;
  17. }
  18.  
  19. void str_to_grid(string str) {
  20.     memset(grid, -1, sizeof grid);
  21.     for(int i = 1, k = 0; i <= 3; ++i)
  22.         for(int j = 1; j <= 3; ++j)
  23.             grid[i][j] = str[k++];
  24. }
  25.  
  26. vector<int> versor{-1, 1, 0};
  27. void bfs(string source, string destiny) {
  28.     queue<string> q;
  29.     q.push(source);
  30.     visited[source] = 1;
  31.     parents[source] = source;
  32.     bool result = false;
  33.     while(q.empty() == 0) {
  34.         string current = q.front();
  35.         q.pop();
  36.         str_to_grid(current);
  37.         for(int i = 1; i <= 3; ++i) {
  38.             for(int j = 1; j <= 3; ++j) {
  39.                 if(grid[i][j] == '0') {
  40.                     for(int m : versor) {
  41.                         for(int n = 1; n >= -1; --n) {
  42.                             if(abs(m + n) == 1 && grid[i + m][j + n] != -1) {
  43.                                 memcpy(buffer, grid, sizeof grid);
  44.                                 buffer[i][j] = buffer[i + m][j + n];
  45.                                 buffer[i + m][j + n] = '0';
  46.                                 if(visited[grid_to_str()] == 0) {
  47.                                     visited[grid_to_str()] = 1;
  48.                                     parents[grid_to_str()] = current;
  49.                                     if(grid_to_str() == destiny) {
  50.                                         result = true;
  51.                                         goto end_loop;
  52.                                     }
  53.                                     q.push(grid_to_str());
  54.                                 }
  55.                             }
  56.                         }
  57.                     }
  58.                 }
  59.             }
  60.         }  
  61.     }
  62. end_loop:;
  63.     if(!result) {
  64.         printf("Problema sem solucao\n");
  65.         return;
  66.     }
  67.  
  68.     stack<string> s;
  69.     string str = grid_to_str();
  70.     while(parents[str] != str) {
  71.         s.push(str);
  72.         str = parents[str];
  73.     }
  74.  
  75.     printf("Quantidade minima de passos = %d\n", s.size());
  76.     bool status = false;
  77.     while(s.empty() == 0) {
  78.         string v = s.top();
  79.         s.pop();
  80.         str_to_grid(v);
  81.         if(status == false) { status = true; } else { printf("\n"); }
  82.         for(int i = 1; i <= 3; ++i) {
  83.             for(int j = 1; j <= 3; ++j) {
  84.                 printf("%c", grid[i][j]);
  85.             }
  86.             printf("\n");
  87.         }
  88.     }
  89. }
  90.  
  91. int main(void) {
  92. begin:;
  93.     memset(buffer, -1, sizeof buffer);
  94.     for(int i = 1; i <= 3; ++i) {
  95.         for(int j = 1; j <= 3; ++j) {
  96.             buffer[i][j] = getchar();
  97.             if(buffer[i][j] == -1)
  98.                 goto end;
  99.         }
  100.         getchar();
  101.     }
  102.  
  103.     bfs(grid_to_str(), "123456780");
  104.     visited.clear();
  105.     parents.clear();
  106.     goto begin;
  107. end:;
  108.            
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement