#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
#define eps (1e-7)
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn= 1000 ;
int n,m;
double E[maxn+10][maxn+10];
int sy,sx;
double A[maxn+10][maxn+10];
double X[maxn+10];
bool in(int x)
{
return 0<=x&&x<m;
}
void guass_elimination()//m行 m+1 列 三对角矩阵
{
int cur,col;
for(cur=0,col=0;cur<m&&col<m ;col++,cur++)
{
//A[cur][col]一定不为0
//因为是三对角矩阵,所以最多是底下一行的几列需要减去该行*k
double tmp= A[cur+1][col]/A[cur][col];
A[cur+1][col+1]-= A[cur][col+1]*tmp;
A[cur+1][m]-=A[cur][m]*tmp;
}
for(int i=cur-1;i>=0;i--)
{
X[i]=A[i][m];
for(int k=i+2;k>i;k--) if(i<m)
{
X[i]-=A[i][k]*X[k];
}
X[i]/=A[i][i];
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
scanf("%d%d",&sy,&sx);
sy--;sx--;
for0(j,m)
{
E[n-1][j]=0;
}
for(int i=n-2;i>=sy;i--)
{
// memset(A,0,sizeof A);因为是三对角矩阵,且没有进行两行交换。所以根本不用memset
for0(j,m)
{
// E[i][j]=1.0+1.0/4*E[i][j-1]+1.0/4*E[i][j+1]+1.0/4*E[i+1][j]+1.0/4*E[i][j];
int num=1;
for(int tj=j-1;tj<=j+1;tj++) if(in(tj))
{
num++;
A[j][tj]=-1.0;
}
A[j][j]=num-1;
A[j][m]= num+E[i+1][j];
}
guass_elimination();//m行m+1列矩阵
for0(j,m)
{
E[i][j]=X[j];
}
}
printf("%.10f\n",E[sy][sx]);
}
return 0;
}