#include<iostream>
using namespace std;
int main()
{
int maX,maY;//马的位置
int X,Y;//棋盘大小
cin>>X>>Y>>maX>>maY;
int ban[9][2];//禁止通过的点,最多有9个
//下面的代码块获取马的位置和可达位置
{
ban[0][0]=maX;
ban[0][1]=maY;
ban[1][0]=maX-1;
ban[1][1]=maY-2;
ban[2][0]=maX+1;
ban[2][1]=maY-2;
ban[3][0]=maX-2;
ban[3][1]=maY-1;
ban[4][0]=maX+2;
ban[4][1]=maY-1;
ban[5][0]=maX-2;
ban[5][1]=maY+1;
ban[6][0]=maX+2;
ban[6][1]=maY+1;
ban[7][0]=maX-1;
ban[7][1]=maY+2;
ban[8][0]=maX+1;
ban[8][1]=maY+2;
}
unsigned int count[X+1][Y+1];//记录每个点到终点的途径数目
//当点(x,y)在禁行区,其值设为0
//点(x,y)不在禁行区,其值等于(x+1,y)与(x,y+1)的和
//即得到递推公式 count[x][y] = count[x+1][y] + count[x+1][y]
count[X][Y]=1;//设置起始条件,终点到终点的途径数目为 1
for(int x=X;x>=0;x--)
{
for(int y=Y;y>=0;y--)
{
if(x==X&&y==Y)continue;//点(X,Y)已在循环体外赋值
else
{
bool BanFlag=false;//BanFlay表示点(x,y)是禁止通过的点
for(int i=0;i<9;i++)
{
if(ban[i][0]==x && ban[i][1]==y)//点(x,y)在禁行区内
{
BanFlag=true;
count[x][y]=0;
break;
}
}
if(BanFlag) continue;//禁行点已处理
else if(x==X)count[x][y]=count[x][y+1];//在棋盘右侧,只加下侧元素
else if(y==Y)count[x][y]=count[x+1][y];//在棋盘底部,只加右侧元素
else count[x][y]=count[x+1][y]+count[x][y+1];//在棋盘底部,同时加 下、右侧元素
}
}
}
cout<<count[0][0];
return 0;
//
}