Guest User

Untitled

a guest
Jan 4th, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <list>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX_DEPTH 1000
  6. #define MAX_NUMBER 10000000
  7.  
  8. int A(int n) { return (n + 7) / 2; }
  9. int B(int n) { return n / 2 + 7; }
  10. int C(int n) { return n * 3 - 5; }
  11. int D(int n) { return (n - 5) * 3; }
  12.  
  13. class T {
  14. public:
  15.     char t; // { _, A, B, C, D }
  16.     int n;
  17.     int L; // pasos
  18.     T *p; // previo
  19.     T(char _t, int _n, int _L, T *_p) { t = _t; n = _n; L = _L; p = _p; }
  20. };
  21.  
  22. typedef T *pT;
  23.  
  24. #define lT list<pT>
  25. #define ilT list<pT>::const_iterator
  26.  
  27. #define Expand(type, F) \
  28.         {                                                            \
  29.             int n = F(t->n);                                         \
  30.             if(n >= 0 && n < MAX_NUMBER && !c[n]) {                  \
  31.                 a[l].push_back(new T(type, n, l, t));                \
  32.                 c[n] = true;                                         \
  33.             }                                                        \
  34.         }
  35.  
  36. void main( void ) {
  37.  
  38.     lT *a = new lT[ MAX_DEPTH ];
  39.     bool *c = new bool[ MAX_NUMBER ];
  40.     for(int i = 0; i < MAX_NUMBER; i++)
  41.         c[i] = false;
  42.    
  43.     a[0].push_back(new T('_', 2018, 0, NULL));
  44.  
  45.     while(1) {
  46.         int l = -1;
  47.         while(++l < MAX_DEPTH)
  48.             if(a[l].size() > 0)
  49.                 break;
  50.         T *t = a[l].back();
  51.         if(t->n == 2017) {
  52.             printf("Solución encontrada:\n");
  53.             while(t) {
  54.                 char *f;
  55.                 switch(t->t) {
  56.                 case '_': f = "\t%i + 7 = %i\n"; break;
  57.                 case 'A': f = "\t(%i + 7) / 2 = %i\n"; break;
  58.                 case 'B': f = "\t%i / 2 + 7 = %i\n"; break;
  59.                 case 'C': f = "\t%i * 3 - 5 = %i\n"; break;
  60.                 case 'D': f = "\t(%i - 5) * 3 = %i\n"; break;
  61.                 }
  62.                 printf(f, t->p == NULL ? 2011 : t->p->n, t->n);
  63.                 t = t->p;
  64.             }
  65.             break;
  66.         }
  67.         a[l++].pop_back();
  68.         if((t->n & 1) == 1) Expand('A', A);
  69.         if((t->n & 1) == 0) Expand('B', B);
  70.         Expand('C', C);
  71.         Expand('D', D);
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment