Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- using namespace std;
- #define MAX_DEPTH 1000
- #define MAX_NUMBER 10000000
- int A(int n) { return (n + 7) / 2; }
- int B(int n) { return n / 2 + 7; }
- int C(int n) { return n * 3 - 5; }
- int D(int n) { return (n - 5) * 3; }
- class T {
- public:
- char t; // { _, A, B, C, D }
- int n;
- int L; // pasos
- T *p; // previo
- T(char _t, int _n, int _L, T *_p) { t = _t; n = _n; L = _L; p = _p; }
- };
- typedef T *pT;
- #define lT list<pT>
- #define ilT list<pT>::const_iterator
- #define Expand(type, F) \
- { \
- int n = F(t->n); \
- if(n >= 0 && n < MAX_NUMBER && !c[n]) { \
- a[l].push_back(new T(type, n, l, t)); \
- c[n] = true; \
- } \
- }
- void main( void ) {
- lT *a = new lT[ MAX_DEPTH ];
- bool *c = new bool[ MAX_NUMBER ];
- for(int i = 0; i < MAX_NUMBER; i++)
- c[i] = false;
- a[0].push_back(new T('_', 2018, 0, NULL));
- while(1) {
- int l = -1;
- while(++l < MAX_DEPTH)
- if(a[l].size() > 0)
- break;
- T *t = a[l].back();
- if(t->n == 2017) {
- printf("Solución encontrada:\n");
- while(t) {
- char *f;
- switch(t->t) {
- case '_': f = "\t%i + 7 = %i\n"; break;
- case 'A': f = "\t(%i + 7) / 2 = %i\n"; break;
- case 'B': f = "\t%i / 2 + 7 = %i\n"; break;
- case 'C': f = "\t%i * 3 - 5 = %i\n"; break;
- case 'D': f = "\t(%i - 5) * 3 = %i\n"; break;
- }
- printf(f, t->p == NULL ? 2011 : t->p->n, t->n);
- t = t->p;
- }
- break;
- }
- a[l++].pop_back();
- if((t->n & 1) == 1) Expand('A', A);
- if((t->n & 1) == 0) Expand('B', B);
- Expand('C', C);
- Expand('D', D);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment