http://acm.hdu.edu.cn/showproblem.php?pid=4405
2012jinhua online
题意: 有 0到 n 个格子,掷骰子走路,求出到终点的数学期望,有飞行的路线。
简单递推。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
const double eps=1e-7;
//const double INF=1e50;
//const double pi=acos(-1);
#define N 105
#define M 100005
int n,fly[M];
double v[M];
int main()
{
//freopen("a","r",stdin);
int i,x,y,m,j;
while (1)
{
scanf("%d%d",&n,&m);
if (n==0 && m==0) break;
memset(fly,0,sizeof(fly));
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
fly[x]=y;
}
memset(v,0,sizeof(v));
for (i=n;i>=0;i--)
{
if (fly[i]>0)
{
if (fly[i]==n) v[i]=0;
else v[i]=v[fly[i]];
continue;
}
for (j=1;j<=6;j++)
if ((i+j)>=n) v[i]+=(double)1/6;//double要加
else v[i]+=(double)(v[i+j]+1)/6;
}
printf("%.4lf\n",v[0]);
}
return 0;
}