#include #include #include ifstream in("optimal.in"); #define MAX 100 queue myq; stack s[MAX][10]; int action[100]; int bestaction[100]; stack r[10]; int kase = 1; int i, j, k, l, n, next, best; int visit(int d); int enqueue(int d, int a) { action[d] = a; return visit(d + 1); } char* name[6] = {"", "ADD", "DIV", "DUP", "MUL", "SUB"}; void print(int p) { if (p == 0) return; print(p - 1); cout << name[bestaction[p - 1]] << ' '; } int found(int p) { int i; for (i = 0; i < n; i++) { if (s[p][i] != r[i]) return 0; } return 1; } int get(int i) { int j = s[next][i].top(); s[next][i].pop(); return j; } int visit(int d) { stack old[10]; int i, j, k, l; if (d >= best) return 0; if (found(next)) { best = d; for (int h = 0; h < d; h++) bestaction[h] = action[h]; } for (i = 0; i < n; i++) old[i] = s[next][i]; if (s[next][0].size() >= 2) { for (j = 0; j < n; j++) { k = get(j); l = get(j); if (k + l > 30000 || k + l < -30000) goto skip_add; s[next][j].push(k + l); } if (enqueue(d, 1)) // add { // print(next); goto end; } // next++; skip_add: for (i = 0; i < n; i++) s[next][i] = old[i]; for (j = 0; j < n; j++) { k = get(j); l = get(j); if (k != 0) { s[next][j].push(l / k); } else goto skip_div; } if (enqueue(d, 2)) // div { // print(next); goto end; } // next++; skip_div:; } for (i = 0; i < n; i++) s[next][i] = old[i]; for (j = 0; j < n; j++) { k = s[next][j].top(); s[next][j].push(k); } enqueue(d, 3); for (j = 0; j < n; j++) s[next][j].pop(); if (s[next][0].size() >= 2) { for (j = 0; j < n; j++) { k = get(j); l = get(j); if (k * l > 30000 || k * l < -30000) goto skip_mul; s[next][j].push(k * l); } if (enqueue(d, 4)) // mul { // print(next); goto end; } // next++; skip_mul: for (i = 0; i < n; i++) s[next][i] = old[i]; for (j = 0; j < n; j++) { k = get(j); l = get(j); if (l - k > 30000 || l - k < -30000) goto skip_sub; s[next][j].push(l - k); } if (enqueue(d, 5)) // sub { // print(next); goto end; } // next++; skip_sub:; } for (i = 0; i < n; i++) s[next][i] = old[i]; end: return 0; } main() { while (in >> n) { if (n == 0) break; cout << "Program " << kase ++ << endl; for (i = 0; i < n; i++) { while(!s[0][i].empty()) s[0][i].pop(); while(!r[i].empty()) r[i].pop(); } for (i = 0; i < n; i++) { in >> j; s[0][i].push(j); } for (i = 0; i < n; i++) { in >> j; r[i].push(j); } for (i = 0; i < n; i++) { if (s[0][i] != r[i]) goto not_empty; } cout << "Empty sequence" << endl << endl;; continue; not_empty: next = 0; best = 11; visit(0); if (best < 11) print(best); else cout << "Impossible"; cout << endl << endl; } }