题目链接:

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. CTF-i春秋网鼎杯第一场misc部分writeup

    CTF-i春秋网鼎杯第一场misc部分writeup 最近因为工作原因报名了网鼎杯,被虐了几天后方知自己还是太年轻!分享一下自己的解题经验吧 minified 题目: 一张花屏,png的图片,老方法, ...

  2. Hibernate第一天——入门和基本操作

    第一个接触的框架就是这个Hibernate框架了,Hibernate本意是 冬眠 ,这里有必要引用CSDN上某位网友某个帖子的评论先引出框架的概念: 框架:一个软件半成品,帮你做了一些基础工作,你就可 ...

  3. Java集合——TreeMap源码详解

    )TreeMap 是一个有序的key-value集合,它是通过红黑树实现的.因为红黑树是平衡的二叉搜索树,所以其put(包含update操作).get.remove的时间复杂度都为log(n). (2 ...

  4. 在eclipse中运行spring web application时的异常: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...

  5. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  6. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX

    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...

  7. node.js学习笔记(一)——创建第一个应用

    巧妇难为无米之炊.要学习node.js,当然必须先有node.js环境(可以去官网 http://nodejs.cn/ 下载安装),如果还是不懂怎么配置开发环境,度娘会告诉你一切. 安装完成环境之后, ...

  8. asp.net core 发布到docker 极简步骤

    1.使用dotnet命令发布项目 2.把发布成功的文件通过scp等工具发布到linux服务器上,在当前目录下新建一个dockerfile 3.使用asp.net core镜像为底包构建一个新的镜像 4 ...

  9. 【PaPaPa】系统架构搭建浅析 - 人人可以搭架构

    声明 [PaPaPa]这个项目是以技术分享与研究为目的而做的,并非商业项目,所以更多的是提供一种思路,请勿直接在项目中使用. 上一篇隐藏开源项目地址实属无奈,为了寻找一起做这件事的同伴不得已刷了一天推 ...

  10. variadic templates & pass by const reference & member operator [] in const map & gcc sucks

    /// bugs code with comments #include <iostream> #include <memory> #include <unordered ...