Advertisement
Guest User

Untitled

a guest
Jan 4th, 2012
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <list>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX_DEPTH 1000
  6. #define MAX_NUMBER 10000000 // repartido para 8 estados
  7.  
  8. const static short map[][8] = {
  9.     { 0, 0, 0, 1, 1, 0, 1, 0 },
  10.     { 0, 0, 1, 0, 0, 0, 0, 0 },
  11.     { 0, 1, 0, 0, 1, 0, 1, 0 },
  12.     { 1, 0, 0, 0, 0, 0, 0, 0 },
  13.     { 0, 0, 0, 0, 0, 0, 0, 1 },
  14.     { 0, 1, 0, 1, 0, 0, 1, 0 },
  15.     { 0, 0, 0, 0, 0, 1, 0, 0 },
  16.     { 0, 1, 0, 1, 1, 0, 0, 0 }
  17. };
  18.  
  19. class T {
  20. public:
  21.     short t; // { Ai = 0, Ad, Bi, Bd, Ci, Cd, Di, Dd = 7 }
  22.     int n;
  23.     T *p; // previo
  24.     T(char _t, int _n, T *_p) { t = _t; n = _n; p = _p; }
  25. };
  26.  
  27. typedef T *pT;
  28.  
  29. #define lT list<pT>
  30. #define ilT list<pT>::const_iterator
  31.  
  32. void main( void ) {
  33.  
  34.     int maxL = MAX_DEPTH;
  35.     lT *a = new lT[ MAX_DEPTH ];
  36.     bool *c = new bool[ MAX_NUMBER ];
  37.     for(int i = 0; i < MAX_NUMBER; i++)
  38.         c[i] = false;
  39.    
  40.     a[0].push_back(new T(0, 2011, NULL));
  41.  
  42.     while(1) {
  43.         int l = -1;
  44.         while(++l < MAX_DEPTH)
  45.             if(a[l].size() > 0)
  46.                 break;
  47.         if(l >= MAX_DEPTH)
  48.             break;
  49.         T *t = a[l].back();
  50.         if(t->n == 2012) {
  51.             printf("Solución encontrada:\n");
  52.             while(t) {
  53.                 char *f;
  54.                 switch(t->t >> 1) {
  55.                 case 0: f = "\t%i + 7 = %i\n"; break;
  56.                 case 1: f = "\t%i / 2 = %i\n"; break;
  57.                 case 2: f = "\t%i * 3 = %i\n"; break;
  58.                 case 3: f = "\t%i - 5 = %i\n"; break;
  59.                 }
  60.                 printf(f, t->p == NULL ? 2011 : t->p->n, t->n);
  61.                 t = t->p;
  62.             }
  63.             //break;
  64.             maxL = l;
  65.         }
  66.         a[l++].pop_back();
  67.         if(l <= maxL) {
  68.             for(int i = 0; i < 8; i++ )
  69.                 if(map[t->t][i]) {                            
  70.                     int n;
  71.                     switch(i >> 1) {
  72.                     case 0: n = t->n + 7; break;
  73.                     case 1: n = t->n / 2; break;
  74.                     case 2: n = t->n * 3; break;
  75.                     case 3: n = t->n - 5; break;
  76.                     }
  77.                     int w = n * 8 + i;                    
  78.                     if(w >= 0 && w < MAX_NUMBER && !c[w]) {  
  79.                         a[l].push_back(new T(i, n, t));    
  80.                         c[w] = true;                          
  81.                     }                                        
  82.                 }
  83.         }
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement