Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <limits>
  4. #include <queue>
  5. #include <climits>
  6. using namespace std;
  7. // solutia finala urmarita
  8. char goal[3][3] = {{'1','2','3'},{'8', ' ','4'},{'7','6','5'}} ;
  9. struct treenode
  10. {
  11.     char b[3][3] ;
  12.     int value; // the key
  13.     struct treenode *left, *right;
  14.     int level;
  15. } *treeroot = NULL;
  16. // calculeaza cheia asociata configuratiei curente
  17. int puzzlevalue(char b[3][3])
  18. {
  19.     int k = 1;
  20.     int value = 0;
  21.     for(int i=0; i<3; i++)
  22.         for(int j=0; j<3; j++)
  23.         {
  24.             if (b[i][j] != ' ') value += k*(b[i][j]-'0');
  25.             k *= 10;
  26.         }
  27.     return value;
  28. }
  29. // adauga un nou nod in arbore
  30. int addnode(struct treenode *&t, char b[3][3])
  31. {
  32.     int value = puzzlevalue(b);
  33.     if(t == NULL)
  34.     {
  35.         t = new struct treenode;
  36.         t -> left = t -> right = NULL;
  37.         for(int i=0; i<3; i++)
  38.             for (int j=0; j<3; j++)
  39.                 t-> b[i][j] = b[i][j];
  40.         t->value = value;
  41.         return 1;
  42.     }
  43.     if(value < t->value) return addnode(t->left,b);
  44.     if(value > t->value) return addnode(t->right,b);
  45.     return 0;
  46. }
  47. // schimba valorile a doua pozitii
  48. void swap(char &a, char &b)
  49. {
  50.     a^=b;
  51.     b^=a;
  52.     a^=b;
  53. }
  54. // afiseaza configuratia curenta
  55. void print(char b[3][3])
  56. {
  57.     for(int i=0; i<3; i++)
  58.     {
  59.         for(int j=0; j<3; j++) cout << b[i][j] << " ";
  60.         cout << endl;
  61.     }
  62.     cout << endl;
  63. }
  64. // genereaza arborele binar
  65. int btgen(char b[3][3], int x, int y)
  66. {
  67.     int g, k=puzzlevalue(b);
  68.     if(k==567408321)
  69.     {
  70.         addnode(treeroot, b);
  71.         return 1;
  72.     }
  73.     if(x > 0)
  74.     {
  75.         swap(b[x][y], b[x-1][y]);
  76.         if(addnode(treeroot, b)) g = btgen(b,x-1,y);
  77.         else g=0;
  78.         swap(b[x][y],b[x-1][y]);
  79.         if(g) return 1; // daca am gasit nu mai continui
  80.     }
  81.     if(y > 0)
  82.     {
  83.         swap(b[x][y],b[x][y-1]);
  84.         if(addnode(treeroot,b))
  85.             g = btgen(b,x,y-1);
  86.         else
  87.             g=0;
  88.         swap(b[x][y],b[x][y-1]);
  89.         if(g)
  90.             return 1;
  91.     }
  92.     if(x<2)
  93.     {
  94.         swap(b[x] [y],b[x+1] [y] ) ;
  95.         if(addnode(treeroot,b)) g = btgen(b,x+1,y);
  96.         else g=0;
  97.         swap(b[x][y],b[x+1][y]);
  98.         if(g) return 1;
  99.     }
  100.     if(y < 2)
  101.     {
  102.         swap(b[x][y],b[x][y+1]);
  103.         if(addnode(treeroot,b)) g = btgen(b,x,y+1);
  104.         else g=0;
  105.         swap(b[x][y],b[x][y+1]);
  106.         if(g) return 1;
  107.     }
  108.     return 0;
  109. }
  110.  
  111. int cnt(treenode *treeroot, int level) {
  112.     if (treeroot == NULL) {
  113.         return 0;
  114.     } else {
  115.         treeroot->level = level;
  116.         return cnt(treeroot->left, level + 1) + cnt(treeroot->right, level + 1) + 1;
  117.     }
  118. }
  119.  
  120.  
  121. bool search(treenode *root, int value) {
  122.     if (root == NULL) {
  123.         return false;
  124.     } else if (root->value == value) {
  125.         return true;
  126.     } else {
  127.         return search(root->right, value) | search(root->left, value);
  128.     }
  129. }
  130.  
  131.  
  132. int minF = INT_MAX;
  133. int maxF = INT_MIN;
  134. int minLevel;
  135. int maxLevel;
  136. int graphLevel;
  137. int solLevel = -1;
  138.  
  139. void searchMinMaxAndSol(treenode *root) {
  140.     queue<treenode *> q;
  141.     q.push(root);
  142.  
  143.     while (!q.empty()) {
  144.         treenode *n = q.front();
  145.         q.pop();
  146.         if (n->value > maxF) {
  147.             maxF = n->value;
  148.             maxLevel = n->level;
  149.         }
  150.         if (n->value < minF) {
  151.             minF = n->value;
  152.             minLevel = n->level;
  153.         }
  154.  
  155.         if(n->value == 567408321) {
  156.             solLevel = n->level;
  157.         }
  158.  
  159.         if (n->left) {
  160.             q.push(n->left);
  161.         }
  162.         if (n->right) {
  163.             q.push(n->right);
  164.         }
  165.  
  166.         graphLevel = n->level;
  167.     }
  168. }
  169. // exemplificare
  170. int main(void)
  171. {
  172.     int N;
  173. // configuratia de start
  174.     char b[3][3] = {{'6','1','2'}, {'5','8','7'},{'4','3',' '}};
  175.     if(btgen(b,2,2))
  176.     {
  177. // numarul de noduri
  178.         N=0;
  179.         N = cnt(treeroot, 0);
  180.         cout << "\n" << N << " noduri\n\n";
  181.         if(!search(treeroot, 567408321))
  182.             cout << "NU ";
  183.         cout << "exista solutia!\n\n";
  184. // nivel val maxima, minima
  185.         //int nmax=0, nmin=0;
  186.         searchMinMaxAndSol(treeroot);
  187.         cout << "\ncheia cu val min " << minF << " este pe niv " << minLevel;
  188.         cout << "\ncheia cu val max " << maxF << " este pe niv " << maxLevel;
  189. //        cout << "\ninaltimea arborelui este " << Height(treeroot,0);
  190.         //int H=0;
  191.         //height(treeroot,0);
  192.         cout << "\nsolutia este pe nivelul " << solLevel;
  193.         cout << "\ninaltimea arborelui este " << graphLevel << endl;
  194.  
  195.     }
  196.     else
  197.         cout << "\nNu a fost identificata solutia " << endl;
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement