node=record
x,y,step:longint;
end;
const
xx:array[1..5] of integer=(-2,1,1,1,1);
yy:array[1..5] of integer=(-2,-1,0,1,2);
var
s1,s2,s3,s4:integer;
head,tail:array[1..2] of longint;
f,g:array[1..2,0..10000000] of node;
use:array[1..2,0..1000,0..1000] of longint;
procedure init;
begin
readln(s1,s2,s3,s4);
head[1]:=0;tail[1]:=1;f[1,1].x:=s1;f[1,1].y:=s2;f[1,1].step:=0;
head[2]:=0;tail[2]:=1;f[2,1].x:=s3;f[2,1].y:=s4;f[2,1].step:=0;
fillchar(use,sizeof(use),0);
end;
procedure check(zi,zh,k,step1:longint);
begin
if use[k,zi,zh]>0 then
begin
write(use[k,zi,zh]+step1+1);
halt;
end;
end;
procedure wide(k:longint);
var
i:longint;
begin
inc(head[k]);
for i:=1 to 5 do
begin
if (f[k,head[k]].x+xx[i]>=0)and(f[k,head[k]].y+yy[i]>=0)
and(f[k,head[k]].x+xx[i]<=205)and(f[k,head[k]].y+yy[i]<=205)
and (use[k,f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i]]=0)
then
begin
check(f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i],3-k,f[k,head[k]].step);
inc(tail[k]);
f[k,tail[k]].x:=f[k,head[k]].x+xx[i];
f[k,tail[k]].y:=f[k,head[k]].y+yy[i];
f[k,tail[k]].step:=f[k,head[k]].step+1;
use[k,f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i]]:=f[k,tail[k]].step;
end;
end;
end;
begin
init;
repeat
if (head[1]<tail[1])and(tail[1]<=tail[2]) then wide(1);
if (head[2]<tail[2])and(tail[2]<tail[1]) then wide(2);
until (head[1]>=tail[1])or(head[2]>=tail[2]);
end.