Files
OI-source/5.24D.cpp
2023-08-03 09:22:52 +08:00

46 lines
894 B
C++

#include<cstdio>
const int maxn=1006;
int n,m,x,y;
double f[maxn][maxn],d[maxn][maxn];
void solve()
{
for(int i=1;i<=m;i++)
{
double w=1.0/d[i][i];
d[i][i]*= w;
d[i][m+1]*= w;
if(i==m) break;
d[i][i+1]*=w;
w=d[i+1][i]/d[i][i];
d[i+1][i]-=w*d[i][i];
d[i+1][i+1]-=w*d[i][i+1];
d[i+1][m+1]-=w*d[i][m+1];
}
for(int i=m-1;i;i--) d[i][m+1]-=d[i+1][m+1]*d[i][i+1];
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d%d%d%d",&n,&m,&x,&y);
for(int i=n-1;i>=x;i--)
{
d[1][1]=d[m][m]=-2/3.0;
d[1][2]=d[m][m-1]=1/3.0;
for(int j=2;j<m;j++)
{
d[j][m+1]=-f[i+1][j]/4.0-1;
d[j][j]=-3/4.0;
d[j][j-1]=d[j][j+1]=1/4.0;
}
if(m==1) d[1][1]=-1/2.0;
d[1][m+1]=-f[i+1][1]/3.0-1;
d[m][m+1]=-f[i+1][m]/3.0-1;
if(m==1) d[m][m+1]=-f[i+1][m]/2.0-1;
solve();
for(int j=1;j<=m;j++) f[i][j]=d[j][m+1];
}
printf("%.10f\n",f[x][y]);
return 0;
}