ladybug.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int allowed[256];
int target;
// dis, ope, val, state
char visited[1100][5][1100][2];
int q[100000000];
int qpr, qpw;
#define OP_NA 0
#define OP_PLUS 1
#define OP_MINUS 2
#define OP_MULT 3
#define OP_DIV 4
#define OP_EQ 5
#define ST_N 0
#define ST_O 1
#define ST_S 2
int eval(int v, int op, int d)
{
if (op==OP_PLUS)
return v+d;
if (op==OP_MINUS)
return v-d;
if (op==OP_MULT)
return v*d;
if (op==OP_DIV && d==0) return 100000;
if (op==OP_DIV)
return v/d;
return d;
}
void qi(int disp, int oper, int val, int state, int dist, int button)
{
if (disp < 0 || disp > 999) return;
if (button != 0 && !allowed[button]) return;
if (state != ST_S) {
if (visited[disp][oper][val][state])
return;
visited[disp][oper][val][state] = 1;
}
// visited ST_S !!
// printf("I %d %d %d %d %d\n", disp, oper, val, state, dist);
q[qpw++] = disp;
q[qpw++] = oper;
q[qpw++] = val;
q[qpw++] = state;
q[qpw++] = dist;
}
void qr(int *disp, int *oper, int *val, int *state, int *dist)
{
*disp = q[qpr++];
*oper = q[qpr++];
*val = q[qpr++];
*state = q[qpr++];
*dist = q[qpr++];
//1 printf("R %d %d %d %d %d\n", *disp, *oper, *val, *state, *dist);
}
int main(int argc, char **argv)
{
int ch;
int i;
int disp, oper, val, state, dist;
int disp2;
while (1) {
memset(allowed
, 0, sizeof(allowed
)); while (1) {
return 0;
if (ch == ' ') break;
allowed[ch] = 1;
//printf("allow %c\n", ch);
}
memset(visited
, 0, sizeof(visited
)); qpr = qpw = 0;
qi(0, OP_NA, 0, ST_S, 0, 0);
for (i=0; i<10; i++)
qi(i, OP_NA, 0, ST_N, 1, '0'+i);
qi(0, OP_PLUS, 0, ST_O, 1, '+');
qi(0, OP_MINUS, 0, ST_O, 1, '-');
qi(0, OP_MULT, 0, ST_O, 1, '*');
qi(0, OP_DIV, 0, ST_O, 1, '/');
qi(0, OP_EQ, 0, ST_O, 1, '=');
while (1) {
qr(&disp, &oper, &val, &state, &dist);
if (disp == target) {
break;
}
if (qpw <= qpr) {
break;
}
if (state == ST_N) {
for (i=0; i<10; i++)
qi(10*disp+i, oper, val, state, dist+1, '0'+i);
disp2 = eval(val, oper, disp);
qi(disp2, OP_PLUS, disp2, ST_O, dist+1, '+');
qi(disp2, OP_MINUS, disp2, ST_O, dist+1, '-');
qi(disp2, OP_MULT, disp2, ST_O, dist+1, '*');
qi(disp2, OP_DIV, disp2, ST_O, dist+1, '/');
qi(disp2, OP_EQ, disp2, ST_O, dist+1, '=');
}
if (state == ST_O) {
for (i=0; i<10; i++)
qi(i, oper, val, ST_N, dist+1, '0'+i);
disp2 = eval(val, oper, disp);
qi(disp2, OP_EQ, disp2, ST_O, dist+1, '=');
qi(disp, OP_PLUS, disp, ST_O, dist+1, '+');
qi(disp, OP_MINUS, disp, ST_O, dist+1, '-');
qi(disp, OP_MULT, disp, ST_O, dist+1, '*');
qi(disp, OP_DIV, disp, ST_O, dist+1, '/');
}
}
}
}