hdu 4405 飞行棋 (dp)

Problem Description
Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6). When Hzz is at grid i and the dice number is x, he will moves to grid i+x. Hzz finishes the game when i+x is equal to or greater than N.

There are also M flight lines on the chess map. The i-th flight line can help Hzz fly from grid Xi to Yi (0<Xi<Yi<=N) without throwing the dice. If there is another flight line from Yi, Hzz can take the flight line continuously. It is granted that there is no two or more flight lines start from the same grid.

Please help Hzz calculate the expected dice throwing times to finish the game.

 
Input
There are multiple test cases.
Each test case contains several lines.
The first line contains two integers N(1≤N≤100000) and M(0≤M≤1000).
Then M lines follow, each line contains two integers Xi,Yi(1≤Xi<Yi≤N). 
The input end with N=0, M=0.

 

Output
For each test case in the input, you should output a line indicating the expected dice throwing times. Output should be rounded to 4 digits after decimal point.

 

Sample Input
2 0
8 3
2 4
4 5
7 8
0 0
 

Sample Output
1.1667
2.3441

题目描述:
飞行棋,掷骰子有等概率得到1-6之间的数字n,然后可以走n步。在棋盘上有飞行点和降落点,走到飞行点时会自动跳到降落点,求从起点到终点的步数的期望。

思路:
dp,计算到终点的距离,则终点处的步数期望为0,一个点能到后面6个点的概率均为1/6,故能得出转移方程 E[i]=E[i+1]*1/6+...+E[i+6]*1/6+1;因为有飞行点的存在,从飞行点到降落点是不需要掷骰子的,所以此时飞行点的期望即降落点的期望。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 100500
int path[MAXN];
int n,m;
double e[MAXN];
int main()
{
 int i,j,a,b;

 while(~scanf("%d%d",&n,&m))
 {
  if(!n&&!m)
   break;
  memset(path,0,sizeof(path));

  for(i=0;i<m;i++)
  {
   scanf("%d%d",&a,&b);
   path[a]=b;
  }

  e[n]=0;
  for(i=n-1;i>=0;i--)
  {
   if(path[i])
    e[i]=e[path[i]];
   else
   {
    e[i]=1;
    for(j=1;j<=6;j++)
    {
     if(i+j<=n)
     e[i]=e[i]+(1.0/6)*e[i+j];
     else
     break;
    }
   }

  }
  printf("%.4f\n",e[0]);
 }
return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scratch飞行棋是一种在Scratch编程平台上制作的飞行棋游戏。飞行棋是一种非常经典的棋类游戏,玩家通过掷骰子并将自己的棋子移动到目标点以取得胜利。 在Scratch飞行棋游戏中,玩家首先需要选择角色和棋子颜色,然后开始游戏。玩家通过点击骰子来掷骰子,并通过将骰子的数字添加到棋子所在方格的标签中来移动棋子。每位玩家必须按照骰子的数字移动对应步数。如果玩家的棋子停在与其它玩家的棋子相同的方格上,那么该棋子将被驱逐回起始位置。 游戏中有一些特殊的方格,它们具有不同的功能。例如,起飞点可以将玩家的棋子从起始位置移动到指定的方格上;遇机会卡时,玩家需要按照卡牌的指示执行相应的动作,如前进或后退;遇到彩虹桥时,玩家可以跳过一些方格,以更快地到达目标点。 游戏目标是让自己的棋子尽快地到达终点。当一个玩家的棋子到达终点时,他就赢得了比赛。游戏可以有两个或更多的玩家参与,每个玩家依次轮流掷骰子并移动棋子。 通过制作和玩Scratch飞行棋,玩家可以学习到很多编程概念,如变量、控制语句和事件处理等。此外,他们还可以锻炼自己的逻辑思维和决策能力。 总的来说,Scratch飞行棋是一种有趣和有教育意义的游戏,适合小朋友和初学者。通过这个游戏,玩家可以在编程的过程中体验游戏的乐趣,并进一步提升自己的编程技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值