概率题一般要倒推 f[i][j]表示在(i, j)时到(r, c)的期望步数
考虑在位置(i, j) 时
f[i][j] = f[i][j] * p[i][j][1] + f[i][j + 1] * p[i][j][2] + f[i + 1][j] * p[i][j][3]
移项 (f[i][j] - f[i][j] * p[i][j][1]) = f[i][j + 1] * p[i][j][2] + f[i + 1][j] * p[i][j][3]
除过去
f[i][j] = (f[i][j + 1] * p[i][j][2] + f[i + 1][j] * p[i][j][3]) / (1 - p[i][j][1])
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int r, c;
double p[1005][1005][4];
double f[1005][1005];
int main()
{
while(cin >> r >> c)
{
for(int i = 1; i <= r; ++i)
for(int j = 1; j <= c; ++j)
for(int k = 1; k <= 3; ++k)
scanf( "%lf", &p[i][j][k] );
f[r][c] = 0;
for(int i = r; i >= 1; --i)
for(int j = c; j >= 1; --j)
{
if(p[i][j][1] == 1 || (i == r && j == c)) continue;
f[i][j] = (p[i][j][2] * f[i][j + 1] + p[i][j][3] * f[i + 1][j] + 2) / (1.0 - p[i][j][1]);
}
printf( "%.3lf\n", f[1][1] );
}
return 0;
}
/*
2 2
0.00 0.50 0.50 0.50 0.00 0.50
0.50 0.50 0.00 1.00 0.00 0.00
*/