#include <stdio.h>
int successCount = 0;
typedef struct
{
int x;
int y;
}Pos;
Pos A,B,C,P1,P2,P3,P4,P5,P6,P7,P8;
int belongToHorseContrl(Pos M)
{
if(
(M.x==C.x&&M.y==C.y)||
(M.x==P1.x&&M.y==P1.y)||
(M.x==P2.x&&M.y==P2.y)||
(M.x==P3.x&&M.y==P3.y)||
(M.x==P4.x&&M.y==P4.y)||
(M.x==P5.x&&M.y==P5.y)||
(M.x==P6.x&&M.y==P6.y)||
(M.x==P7.x&&M.y==P7.y)||
(M.x==P8.x&&M.y==P8.y)
)
return 1;
else
return 0;
}
int outOfBoundary(Pos M)
{
if(M.x<0||M.x>B.x||M.y<0||M.y>B.y)
return 1;
else
return 0;
}
int touchBPos(Pos M)
{
if(M.x==B.x&&M.y==B.y)
return 1;
else
return 0;
}
//int level = 0;
void findNextStep(Pos M)
{
//level++;
//printf("第%d层\n", level);
Pos M1,M2;
M1.x = M.x+1;
M1.y = M.y;
M2.x = M.x;
M2.y = M.y+1;
CheckDown://先判断M1
if(belongToHorseContrl(M1)==1)
{
//printf("第%d层往下属于马\n", level);
//return;
}
else if(outOfBoundary(M1)==1)
{
//printf("第%d层往下出界\n", level);
//return;
}
else if(touchBPos(M1)==1)
{
//printf("第%d层往下找到B\n", level);
successCount++;
}
else
{
findNextStep(M1);
}
CheckRight://再判断M2
if(belongToHorseContrl(M2)==1)
{
//printf("第%d层往右属于马\n", level);
//return;
}
else if(outOfBoundary(M2)==1)
{
//printf("第%d层往右出界\n", level);
//return;
}
else if(touchBPos(M2)==1)
{
//printf("第%d层往右找到B\n", level);
successCount++;
}
else
{
findNextStep(M2);
}
}
int main()
{
A.x = 0;
A.y = 0;
scanf("%d %d %d %d",&(B.x),&(B.y),&(C.x),&(C.y));
P1.x = C.x+2;
P1.y = C.y+1;
P2.x = C.x+1;
P2.y = C.y+2;
P3.x = C.x-1;
P3.y = C.y+2;
P4.x = C.x-2;
P4.y = C.y+1;
P5.x = C.x-2;
P5.y = C.y-1;
P6.x = C.x-1;
P6.y = C.y-2;
P7.x = C.x+1;
P7.y = C.y-2;
P8.x = C.x+2;
P8.y = C.y-1;
findNextStep(A);
printf("%d",successCount);
return 0;
}