去北邮比赛因为没考虑这个WA到比赛结束,郁闷啊,不然就绝对不止4题了
由于可能出现a[i][j]=1的情况,除了以后就可能出现某个值是无穷大,那么等下用0去乘后就不为0了!!!
其实题目说了,不存在大于10^6的答案,所以没有概率大于0的路径通过a[i][j]=1这种格子,可是上面的会导致错误
#include <cstdio>
#include <cstring>
#include <cmath>
const int MAXN= 1000 + 123;
double a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
double e[MAXN][MAXN];
int main()
{
int rr,rc;
while(scanf("%d%d", &rr, &rc) != EOF)
{
for(int i = 1; i <= rr; i++)
for(int j = 1; j <= rc; j++)
scanf("%lf%lf%lf", &a[i][j], &b[i][j], &c[i][j]);//原地,右方,下面
//e[i][j] = 2 + a[i][j] * e[i][j] + b[i][j] * e[i][j+1] + c[i][j] * e[i+1][j]
for(int i = rr; i >= 1; i--)
for(int j = rc; j >= 1; j--)
{
e[i][j] = 0;
if( i== rr && j == rc) continue;
if(i < rr) e[i][j] += c[i][j] * e[i+1][j];
if(j < rc) e[i][j] += b[i][j] * e[i][j+1];
e[i][j] += 2.00;
if(fabs(a[i][j] - 1.00) > 1e-8) e[i][j] = e[i][j] / (1 - a[i][j]);
else e[i][j] = 1.00 ;
}
printf("%0.3lf\n", e[1][1]);
}
return 0;
}