ladybug.cpp
#include <algorithm>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
#define DEBUG(x) cerr << ">>> " << #x << " : " << x << endl;
#define REP(i,a) for (int i = 0; i < (a); ++i)
#define FOR(i,a,b) for (int i = (a); i <= (b); ++i)
#define FORD(i,a,b) for (int i = (a); i >= (b); --i)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
const int INF = 1<<29;
typedef long long ll;
//////////////////////////////////
int N;
int dist[1001][1001][6][3];
/*
OPERATOR:
+ 0
- 1
* 2
/ 3
= 4
N/A 5
*/
queue<int> qa, qb, qc, qd;
void add(int disp, int value, int op, int state, int d){
if(disp < 1000 && disp >= 0 && dist[disp][value][op][state] == -1){
dist[disp][value][op][state] = d;
qa.push(disp);
qb.push(value);
qc.push(op);
qd.push(state);
}
}
char oper[111];
int OP;
int eval(int x, int y, int op){
if(op == 0) return x + y;
if(op == 1) return x - y;
if(op == 2) return x * y;
if(op == 3) return x / y;
}
int decode(char c){
if(c == '+') return 0;
if(c == '-') return 1;
if(c == '*') return 2;
if(c == '/') return 3;
if(c == '=') return 4;
}
int main() {
while(scanf("%s%d", oper, &N) != EOF){
OP = strlen(oper);
REP(i, 1000) REP(j, 1000) REP(k, 6) REP(l, 3) dist[i][j][k][l] = -1;
qa = queue<int>();
qb = queue<int>();
qc = queue<int>();
qd = queue<int>();
//while(!qa.empty()){ qa.pop(); qb.pop(); qc.pop(); qd.pop(); }
add(0, 0, 5, 2, 0);
bool ok = false;
while(!qa.empty()){
int disp = qa.front(), value = qb.front(), op = qc.front(), state = qd.front();
qa.pop(); qb.pop(); qc.pop(); qd.pop();
int d = dist[disp][value][op][state];
if(disp == N){ printf("%d\n", dist[disp][value][op][state]); ok = true; break; }
REP(i, OP){
char c = oper[i];
if(c <= '9' && c >= '0'){
int x = c - '0';
if(state == 0) add(x, value, op, 1, d+1);
if(state == 1) add(10 * disp + x, value, op, 1, d+1);
if(state == 2) add(x, value, op, 1, d+1);
}
else{
int o = decode(c);
if(state == 1){
if(op < 3 || (op == 3 && disp)) add(eval(value, disp, op), eval(value, disp, op), o, 0, d+1);
if(op > 3) add(disp, disp, o, 0, d+1);
}
if(state == 0){
if(o == 4 && op != 4){ if(!(op == 3 && disp == 0)) add(eval(value, disp, op), eval(value, disp, op), o, 0, d+1); }
else add(disp, disp, o, 0, d+1);
}
if(state == 2) add(disp, value, o, 0, d+1);
}
}
}
if(!ok) printf("impossible\n");
}
return 0;
}