[lightoj P1151] Snakes and Ladders
1151 - Snakes and Ladders
Time Limit: 2 second(s) Memory Limit: 32 MB
'Snakes and Ladders' or 'Shap-Ludu' is a game commonly played in Bangladesh. The game is so common that it would be tough to find a person who hasn't played it. But those who haven't played it (unlucky of course!) the rules are as follows. There is a 10 x 10 board containing some cells numbered from 1 to 100.
- You start at position 1.
- Each time you throw a perfect dice containing numbers 1 to 6.
- There are some snakes and some ladders in the board. Ladders will take you up from one cell to another. Snakes will take you down.
- If you reach a cell that contains the bottom part of a ladder, you will immediately move to the cell which contains the upper side of that ladder. Similarly if you reach a cell that has a snake-head you immediately go down to the cell where the tail of that snake ends.
- The board is designed so that from any cell you can jump at most once. (For example there is a snake from 62 to 19, assume that another is from 19 to 2. So, if you reach 62, you will first jump to 19, you will jump to 2. These kinds of cases will not be given)
- There is no snake head in the 100-th cell and no ladder (bottom part) in the first cell.
- If you reach cell 100, the game ends. But if you have to go outside the board in any time your move will be lost. That means you will not take that move and you have to throw the dice again.
Now given a board, you have to find the expected number of times you need to throw the dice to win the game. The cases will be given such that a result will be found.
Input
Input starts with an integer T (≤ 105), denoting the number of test cases.
The first line of a case is a blank line. The next line gives you an integer n denoting the number of snakes and ladders. Each of the next n lines contain two integers a and b (1 ≤ a, b ≤ 100, a ≠ b). If a < b, it means that there is a ladder which takes you from a to b. If a > b, it means that there is a snake which takes you from a to b. Assume that the given board follows the above restrictions.
Output
For each case of input, print the case number and the expected number of times you need to throw the dice. Errors less than 10-6 will be ignored.
Sample Input
2
14
4 42
9 30
16 8
14 77
32 12
37 58
47 26
48 73
62 19
70 89
71 67
80 98
87 24
96 76
0
Output for Sample Input
Case 1: 31.54880806
Case 2: 33.0476190476
主要题意就不解释了。。
我们设从点i到100的步数期望为Ei。
则:
如果Ei有连向其他格子的边,设走到to[i],则Ei=Etoi。
否则Ei=(Ex1+Ex2+...+Exk)*(1/6)+1。其中,k=min(6,100-i),x1+1=x2,x2+1=x3,......xi+1=xi+1。
但是我们发现,to[i]可能大于i,也可能小于i,所以不能直接DP或递推。
所以相当于解一个有100个100元方程的方程组。其中最后一个方程已经确定,且得到E[100]=0。
那么,就相当于用高斯消元解一个有唯一解的实数方程组了。
code:
#include<bits/stdc++.h> #define Ms(a,x) memset(a,x,sizeof a) using namespace std; ; int n,got[N]; double a[N][N],E[N]; ?x:-x;} void Gauss(int equ,int var) { ,col=,cho; for (; row<=equ&&col<=var; row++,col++) { cho=row; ; i<=equ; i++) if (abso(a[i][col])>abso(a[cho][col])) cho=col; if (cho!=row) ; i++) swap(a[cho][i],a[row][i]); ) {col--; continue;} ; i<=equ; i++) ) { double k=a[i][col]/a[row][col]; ; j++) a[i][j]-=k*a[row][j]; } } for (int i=var; i; i--) { ]; ; j<=var; j++) re-=a[i][j]*E[j]; E[i]=re/a[i][i]; } } int main() { int T; scanf("%d",&T); ; ts<=T; ts++) { cin>>n,Ms(got,),Ms(a,),Ms(E,); ,x,y; i<=n; i++) scanf("%d%d",&x,&y),got[x]=y; ,c; i<; i++) if (!got[i]) { c=min(,-i),a[i][i]=c,a[i][]=; ; j<=&&i+j<=; j++) a[i][i+j]=-; } ,a[i][got[i]]=-,a[i][]=; a[][]=,a[][]=; Gauss(,); printf(]); } ; }
[lightoj P1151] Snakes and Ladders的更多相关文章
- LightOJ - 1151 Snakes and Ladders —— 期望、高斯消元法
题目链接:https://vjudge.net/problem/LightOJ-1151 1151 - Snakes and Ladders PDF (English) Statistics F ...
- LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP
首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...
- LightOJ - 1151 Snakes and Ladders
LightOJ - 1151 思路: 将期望dp[x]看成自变量,那么递推式就可以看成方程组,用高斯消元求方程组的解就能求解出期望值 高斯消元求解的过程也是期望逆推的过程,注意边界情况的常数项,是6/ ...
- LightOJ 1151 Snakes and Ladders(概率DP + 高斯消元)
题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵.每次走都需要掷一次骰子(1~6且 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
- LightOJ - 1151 Snakes and Ladders(概率dp+高斯消元)
有100个格子,从1开始走,每次抛骰子走1~6,若抛出的点数导致走出了100以外,则重新抛一次.有n个格子会单向传送到其他格子,G[i]表示从i传送到G[i].1和100不会有传送,一个格子也不会有两 ...
- Snakes and Ladders LightOJ - 1151( 概率dp+高斯消元)
Snakes and Ladders LightOJ - 1151 题意: 有100个格子,从1开始走,每次抛骰子走1~6,若抛出的点数导致走出了100以外,则重新抛一次.有n个格子会单向传送到其他格 ...
- [Swift]LeetCode909. 蛇梯棋 | Snakes and Ladders
On an N x N board, the numbers from 1 to N*N are written boustrophedonically starting from the botto ...
- light oj 1151 - Snakes and Ladders 高斯消元+概率DP
思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...
随机推荐
- 4、jeecg 笔记之 自定义显示按钮 (exp 属性)
1.需求 先看一下需求吧,我们希望 datagrid 操作栏中的按钮,可以根据条件进行动态显示. 2.实现 其实 jeecg 提供了一个属性 - exp ,通过该属性即可实现. <t:dgFun ...
- Java-idea-mybatis plugin插件使用
方案一.免费插件[推荐] Free Mybatis plugin 方案二.破解插件 安装路径 File→Setting→plugin→Install plugin 搜索需要插件即可 搜索Mybati ...
- 十一、无事勿扰,有事通知(2)——KVO
概述 Key-Value-Observe,简称KVO,和上节介绍的Notification师出同门,主要目的都是为了实现观察者模式. 虽说是同门师兄弟,但是各自精通的技艺却是各不相同的. 不像Noti ...
- HBuilder/Mui开发ios使用上拉刷新导致滚动条无法使用的解决方法
HBuilder/Mui开发的APP使用上拉刷新,当滚动到底部是会触发上拉刷新,加载更多数据.但是ios上确是一个坑,导致滚动条无法滚动. 解决方法 放弃Mui的上拉刷新,自己使用JS实现. var ...
- mysql误删root
在Linux中有时安装Mysql会出现没有root用户的状况,或者说root账户被从mysql.user表中误删除,这样就导致很多权限无法控制.解决办法是重新创建root用户,并授予所有权限,具体方法 ...
- 用命令行打开sublime
在linux下装了linux后默认并不能通过运行命令的方式打开,这就让我们不能像vim一样可以通过 vim <fileName> 来打开文件. 不过我们可以通过把sublime的执行文件放 ...
- Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...
- ili9325--LCD寄存器配置研究
2011-06-22 22:18:12 自己根据ili9325的规格书编写驱动.发现LCD屏没显示.于是怀疑是某些寄存器设置错误.要调试的话最好还是先熟悉寄存器的作用,调试的时候只要看到现象就能分析了 ...
- jupyter notebook新用法
输入单词以后按下tab键以后 出现提示 a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降>>> a = np.array([[1,2], [3,4]]) ...
- zabbix部署相关
一.centos7 安装zabbix 二.zabbix 乱码问题 三.zabbix自动发现自动注册 四.zabbix3.4实现sendEmail邮件报警