- 很多数学期望DP都会采取倒推的方式执行
 
- DP套高斯消元,以行号为阶段。系数方程比较特殊,因此可以特殊处理以降低时间复杂度
 
#include <bits/stdc++.h>
using namespace std;
double f[1005][1005];
int cur;
double c[1005][1005];
void Gauss(int m,int n)
{
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=i+1;j++)
		{
			if(i==j)
			{
				continue;
			}
			double rate=c[j][i]/c[i][i];
			for(int k=i;k<=i+1&&k<=n;k++)
			{
				c[j][k]-=c[i][k]*rate;
			}
			c[j][n+1]-=c[i][n+1]*rate;
		}
	}
	f[cur][n]=c[n][n+1]/c[n][n];
	for(int i=n-1;i>=1;i--)
	{
		f[cur][i]=(c[i][n+1]-f[cur][i+1]*c[i][i+1])/c[i][i];
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	if(m==1)
	{
		cout<<fixed<<setprecision(10)<<2.0*(n-x)<<endl;
		return 0;
	}
	for(int i=n-1;i>=x;i--)
	{
		cur=i;
		c[1][1]=2.0/3.0;
		c[1][2]=-1.0/3.0;
		c[1][m+1]=1.0/3.0*f[i+1][1]+1;
		for(int j=2;j<m;j++)
		{
			c[j][j-1]=-0.25;
			c[j][j]=0.75;
			c[j][j+1]=-0.25;
			c[j][m+1]=0.25*f[i+1][j]+1;
		}
		c[m][m-1]=-1.0/3.0;
		c[m][m]=2.0/3.0;
		c[m][m+1]=1.0/3.0*f[i+1][m]+1;
		Gauss(m,m);
	}
	cout<<fixed<<setprecision(10)<<f[x][y]<<endl;
	return 0;
}