题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2262

Where is the canteen

Time Limit: 10000/5000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
#### 问题描述
> After a long drastic struggle with himself, LL decide to go for some snack at last. But when steping out of the dormitory, he found a serious problem : he can't remember where is the canteen... Even worse is the campus is very dark at night. So, each time he move, he check front, back, left and right to see which of those four adjacent squares are free, and randomly walk to one of the free squares until landing on a canteen.
#### 输入
> Each case begin with two integers n and m ( n
> '@' is the start location. There is exactly one in each case.
> '#' is an impassible square.
> '$' is a canteen. There may be more than one in the campus.
> '.' is a free square.
#### 输出
> Output the expected number of moves required to reach a canteen, which accurate to 6 fractional digits. If it is impossible , output -1.
####样例输入
> 1 2
> @$
> 2 2
> @.
> .$
> 1 3
> @#$

样例输出

1.000000

4.000000

-1

题意

给你校园地图:n*m的网格,现在有个人从宿舍出来,要去食堂,由于天太黑,他看不见路,所以他会随机走到相邻的可以到达的点(也就是不是边界和墙,走过的点也还有可能走),问他到达食堂的期望步数。

题解

dp[i][j]表示在i,j点到达食堂需要的期望步数。

根据全期望公式易得:dp[i*m+j]=(ne1+ne2+...+nek)/k+1

明显有环,不能直接递推。数据很小,我们处理下式子:ne1+ne2+...+nek-k*dp[i*m+j]=-k。然后直接上高斯消元。

代码

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-9;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=233; typedef double Matrix[maxn][maxn]; ///n*(n+1)的增广矩阵
bool gauss_jordan(Matrix A,int n) {
int i,j,k,r;
for(i=0; i<n; i++) {
r=i;
for(j=i+1; j<n; j++) {
if(fabs(A[j][i])>fabs(A[r][i])) r=j;
}
if(fabs(A[r][i])<eps) continue;
if(r!=i) for(j=0; j<=n; j++) swap(A[r][j],A[i][j]); for(k=0; k<n; k++) if(k!=i) {
for(j=n; j>=i; j--) A[k][j]-=A[k][i]/A[i][i]*A[i][j];
}
} ///矛盾式
for(int i=n-1; i>=0&&fabs(A[i][i])<eps; i--) {
if(fabs(A[i][n])>eps) return false;
}
return true;
} Matrix A; char mat[22][22];
int n,m;
bool vis[22][22]; const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1}; ///求起点所在的联通块,其他不连通的地区不要啦进来算
bool flag;
void dfs(int x,int y) {
vis[x][y]=1;
if(mat[x][y]=='$') flag=true;
for(int i=0; i<4; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(vis[nx][ny]) continue;
if(mat[nx][ny]=='#') continue;
dfs(nx,ny);
}
} void init() {
clr(vis,0);
clr(A,0);
} int main() {
while(scf("%d%d",&n,&m)==2) {
init();
for(int i=0; i<n; i++) scf("%s",mat[i]);
int xs,ys;
rep(i,0,n) rep(j,0,m) if(mat[i][j]=='@') {
xs=i,ys=j;
break;
}
flag=false;
dfs(xs,ys); ///根本到不了任何食堂
if(!flag){
puts("-1");
continue;
} ///构造方程组
int nn=n*m;
rep(i,0,n) rep(j,0,m) {
if(!vis[i][j]) continue;
if(mat[i][j]=='$') {
A[i*m+j][i*m+j]=1.0;
} else {
int k=0,ix=i*m+j;
for(int ii=0; ii<4; ii++) {
int nx=i+dx[ii];
int ny=j+dy[ii];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(!vis[nx][ny]) continue;
k++;
int iy=nx*m+ny;
A[ix][iy]=1.0;
}
A[ix][ix]=-1.0*k;
A[ix][nn]=-1.0*k;
}
} bool su=gauss_jordan(A,nn); int p=xs*m+ys;
if(!su||fabs(A[p][p])<eps) prf("-1\n");
else prf("%.6lf\n",A[p][nn]/A[p][p]);
}
return 0;
} //end-----------------------------------------------------------------------

HDU 2262 Where is the canteen 期望dp+高斯消元的更多相关文章

  1. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  2. hdu4418 Time travel 【期望dp + 高斯消元】

    题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...

  3. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  4. LightOJ 1151 Snakes and Ladders 期望dp+高斯消元

    题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定   而且 ...

  5. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...

  6. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

  7. Codeforces.24D.Broken robot(期望DP 高斯消元)

    题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...

  8. HDU4418 Time travel(期望dp 高斯消元)

    题意 题目链接 Sol mdzz这题真的太恶心了.. 首先不难看出这就是个高斯消元解方程的板子题 \(f[x] = \sum_{i = 1}^n f[to(x + i)] * p[i] + ave\) ...

  9. [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元

    3150: [Ctsc2013]猴子 Time Limit: 20 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 163  Solved: 10 ...

随机推荐

  1. zabbix服务快速搭建指南

    zabbix监控服务快速安装指南 1.更换centos7-base源为阿里源  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.ali ...

  2. C语言学习记录_2019.02.05

    switch只能判断整数,而分段函数的判别是一个范围,我们无法用整数来表示范围 跟踪语句的方法: (1)debug调试 (2)printf( )语句跟踪 小套路:当循环次数很大时,可以先模拟较小次数的 ...

  3. Hexo+Github博客搭建

    一.准备 1.安装git 点击下载:链接:https://pan.baidu.com/s/1eToStns 密码:r93r 安装参考之前随笔:http://www.cnblogs.com/jiangb ...

  4. 2017-2018-1 20155210 《信息安全系统设计基础》 实现mypwd

    2017-2018-1 20155210 <信息安全系统设计基础> 实现mypwd 作业要求: 1.学习pwd命令 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...

  5. 《记忆匣子》——网络编程jsp网页制作复习习笔记1

    内容都在图里 哈哈哈 <%@ page language="java" contentType="text/html; charset=utf-8" pa ...

  6. 【LNOI2014】LCA

    题面 题解 考察\(dep[\mathrm{LCA}(i, x)]\)的性质,发现它是\(i\)和\(x\)的链交的长度. 那么对每个\(i\)所在的链打一个区间加标记,询问时算一下\(x\)所在的链 ...

  7. 【TJOI2017】DNA

    题面 题解 对字符串一脸懵的我肯定只能用$FFT$这种暴力方法水过啊... 将后面那个字符串翻转一下,对$\text{AGCT}$分别统计,用$FFT$就可以啦 代码 #include<cstd ...

  8. CentOS 7 安装 caffe

    1.安装CUDA,很简单,傻瓜式安装 2.http://caffe.berkeleyvision.org/install_yum.html 按照里面安装 3.遇到的问题: LD -o .build_r ...

  9. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  10. SpringCloud-容错处理Hystrix熔断器(五)

    前言:微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系.但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相 ...