#include <bits/stdc++.h>
using namespace std
struct CUP
{
int x, y
//y表示这个杯子的容量
}
struct Node
{
CUP a[4]
int step
} st, ENDDD
bool flag[111][111][111][111]
int dir[12][2] = {//dir[i][j]表示杯子i向杯子j倒水
0, 1,
0, 2,
0, 3,
1, 0,
1, 2,
1, 3,
2, 0,
2, 1,
2, 3,
3, 0,
3, 1,
3, 2,
}
int BFS()
{
queue<Node> que
que.push(st)
memset(flag, false, sizeof(flag))
flag[10][0][0][0] = true
while (!que.empty())
{
Node pre = que.front()
que.pop()
if (pre.a[0].x == ENDDD.a[0].x && pre.a[1].x == ENDDD.a[1].x && pre.a[2].x == ENDDD.a[2].x && pre.a[3].x == ENDDD.a[3].x)
return pre.step
for (int i = 0
{
int a = dir[i][0], b = dir[i][1]
Node tmp = pre
if (tmp.a[a].x == 0 || tmp.a[b].x == tmp.a[b].y)
continue
if (tmp.a[a].x >= tmp.a[b].y - tmp.a[b].x)//能倒满
{
tmp.a[a].x -= (tmp.a[b].y - tmp.a[b].x)
tmp.a[b].x = tmp.a[b].y
}
else if (tmp.a[a].x + tmp.a[b].x <= tmp.a[b].y)// 倒空
{
tmp.a[b].x += tmp.a[a].x
tmp.a[a].x = 0
}
if (flag[tmp.a[0].x][tmp.a[1].x][tmp.a[2].x][tmp.a[3].x] == false)
{
flag[tmp.a[0].x][tmp.a[1].x][tmp.a[2].x][tmp.a[3].x] = true
tmp.step = pre.step + 1
que.push(tmp)
}
}
}
return 0
}
int main()
{
int a, b, c, d
while (~scanf("%d%d%d%d", &a, &b, &c, &d))
{
if (a + b + c + d != 10)
{
printf("-1\n")
continue
}
st.a[0].x = 10
st.a[0].y = 10
st.a[1].x = 0
st.a[1].y = 6
st.a[2].x = 0
st.a[2].y = 5
st.a[3].x = 0
st.a[3].y = 4
st.step = 0
ENDDD.a[0].x = a
ENDDD.a[0].y = 10
ENDDD.a[1].x = b
ENDDD.a[1].y = 6
ENDDD.a[2].x = c
ENDDD.a[2].y = 5
ENDDD.a[3].x = d
ENDDD.a[3].y = 4
ENDDD.step = 0
int ans = BFS()
printf("%d\n", ans)
}
return 0
}