RT,下面这组就会输出nan
385 978
344 18 (CF #5)
代码:
// Problem: CF24D Broken robot
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF24D
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#include <bits/stdc++.h>
using namespace std;
#define M 1010
int n,x,m,y;
double f[M][M],a[M][M],c[M];
void Made(int x)
{
a[1][1]=a[m][m]=2,a[1][2]=a[m][m-1]=-1,c[1]=f[x+1][1]+3,c[m]=f[x+1][m]+3;
for(int i=2;i<m;i++) a[i][i]=3,a[i][i-1]=a[i][i+1]=-1,c[i]=f[x+1][i]+4;
}
void Solve(int x)
{
double pmu;
for(int i=2;i<=m;i++)
{
pmu=-a[i-1][i-1];
a[i][i]*=pmu,a[i][i+1]*=pmu,c[i]*=pmu;
a[i][i]-=a[i-1][i];a[i][i+1]-=a[i-1][i+1];c[i]-=c[i-1];a[i][i-1]=0;
}
f[x][m]=c[m]/a[m][m];
for(int i=m-1;i>=1;i--)
{
f[x][i]=(c[i]-a[i][i+1]*f[x][i+1])/a[i][i];
}
}
int main()
{
cin>>n>>m>>x>>y;
if(n==1||n==x) {printf("%.10lf",0);return 0;}
if(m==1) {printf("%.10lf",2*(n-x));return 0;}
for(int i=n-1;i>=1;i--) Made(i),Solve(i);
printf("%.10lf",f[x][y]);
return 0;
}