46 lines
894 B
C++
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;
|
|
} |