ShowID=1423">http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1423

设dp[i]表示在i点时到达终点要走的期望步数,那么dp[i] = ∑1/m*dp[j] + 1,j是与i相连的点,m是与i相邻的点数。建立方程组求解。重要的一点是先推断DK到达不了的点。须要bfs预处理一下进行离散化,再建立方程组。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
//#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 10000007; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
int cnt;
char g[15][15];
int equ,var;
double a[110][110];
double x[110];
int num[15][15];
int sx,sy,ex,ey; struct node
{
int x,y;
}; bool Gauss()
{
int row,col,max_r;
int i,j;
row = col = 0;
while(row < equ && col < var)
{
max_r = row;
for(i = row+1; i < equ; i++)
if(fabs(a[i][col]) > fabs(a[max_r][col]))
max_r = i;
if(max_r != row)
{
for(j = col; j <= var; j++)
swap(a[row][j],a[max_r][j]);
}
if(fabs(a[row][col]) < eps)
{
col++;
continue;
}
for(i = row+1; i < equ; i++)
{
if(fabs(a[i][col]) < eps) continue;
double t = a[i][col] / a[row][col];
a[i][col] = 0;
for(j = col+1; j <= var; j++)
a[i][j] -= a[row][j]*t;
}
row++;
col++;
}
for(i = row; i < equ; i++)
{
if(fabs(a[i][var]) > eps)
return false;
}
for(i = var-1; i >= 0; i--)
{
if(fabs(a[i][i]) < eps) continue;
double t = a[i][var];
for(j = i+1; j < var; j++)
t -= a[i][j]*x[j];
x[i] = t/a[i][i];
}
return true;
} void bfs()
{
cnt = 0;
memset(num,-1,sizeof(num));
queue <struct node> que;
que.push((struct node){sx,sy});
num[sx][sy] = cnt++;
while(!que.empty())
{
struct node u = que.front();
que.pop();
for(int d = 0; d < 4; d++)
{
int x = u.x + dir[d][0];
int y = u.y + dir[d][1];
if(x >= 1 && x <= n && y >= 1 && y <= m && g[x][y] != 'X' && num[x][y] == -1)
{
que.push( (struct node){x,y} );
num[x][y] = cnt++;
}
}
}
} int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i = 1; i <= n; i++)
{
scanf("%s",g[i]+1);
for(int j = 1; j <= m; j++)
{
if(g[i][j] == 'D')
{
sx = i;
sy = j;
}
if(g[i][j] == 'E')
{
ex = i;
ey = j;
}
}
}
bfs();
equ = var = cnt;
memset(a,0,sizeof(a));
memset(x,0,sizeof(x)); for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(g[i][j] == 'X') continue;
//printf("%d %d %d\n",i,j,M[make_pair(i,j)]);
int t = num[i][j];
if(t == -1) continue;
if(g[i][j] == 'E')
{
a[t][t] = 1;
a[t][cnt] = 0;
}
else
{
a[t][t] = 1;
a[t][cnt] = 1;
int c = 0;
for(int d = 0; d < 4; d++)
{
int ii = i + dir[d][0];
int jj = j + dir[d][1];
if(ii >= 1 && ii <= n && jj >= 1 && jj <= m && g[ii][jj] != 'X' && num[ii][jj] != -1)
c++;
}
for(int d = 0; d < 4; d++)
{
int ii = i + dir[d][0];
int jj = j + dir[d][1];
if(ii >= 1 && ii <= n && jj >= 1 && jj <= m && g[ii][jj] != 'X' && num[ii][jj] != -1)
{
int tt = num[ii][jj];
a[t][tt] = -1.0/c;
}
}
}
}
}
if(!Gauss())
printf("tragedy!\n");
else if(fabs(x[num[sx][sy]]-1000000)<eps)
printf("tragedy!\n");
else printf("%.2lf\n",x[num[sx][sy]]);
}
return 0;
}

ZJUT 地下迷宫 (高斯求期望)的更多相关文章

  1. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

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

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

  3. HDU4870_Rating_双号从零单排_高斯消元求期望

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...

  4. hdu 4870 rating(高斯消元求期望)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. hdu4035 Maze (树上dp求期望)

    dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...

  6. ZOJ 3822(求期望)

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  7. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  8. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  9. PTA地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

随机推荐

  1. dell R720服务器设置开机启动顺序

    开机按F2进入系统启动设置,也可以按F11进入快速启动配置

  2. Linux中断处理(一)

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着"重要的事马上做, 不重要的事推后做"的异步处理思想. 于是整理一下~~第一阶段--获取中断号每个 ...

  3. vim常用

    删除空行 :g@^$@d

  4. C <string.h>常用函数介绍

    1. strcpychar *strcpy(char *destin, char *source);功能:将source指向的字符串拷到destin. int main() { ]; "; ...

  5. selenium webdriver+python基本操作

    # -*- coding:utf-8 -*-#导入模块from selenium import webdriver from selenium.common.exceptions import NoS ...

  6. python 全栈开发,Day53(jQuery的介绍,jQuery的选择器,jQuery动画效果)

    js总结 js: 1.ECMAScript5 ES5语法 2.DOM CRUD 获取 3种方式 id tag className //面向对象 对象 : 属性和方法 某个对象中 function $( ...

  7. Linux学习笔记:ftp中binary二进制与ascii传输模式的区别

    在使用ftp传输文件时,常添加上一句: binary  -- 使用二进制模式传输文件 遂查资料,如下所获. FTP可用多种格式传输文件,通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本 ...

  8. 老方块Oracle--数值类型性能考虑

    我们在设计数据库表,或者在使用SQL,写程序时都会经常用到数值类型.比如常见的number.int.float. float是浮点类型,也属于数值类型,我们最常用的是number类型. 他的格式是nu ...

  9. hdu 1588 求f(b) +f(k+b) +f(2k+b) +f((n-1)k +b) 之和 (矩阵快速幂)

    g(i)=k*i+b; 0<=i<nf(0)=0f(1)=1f(n)=f(n-1)+f(n-2) (n>=2)求f(b) +f(k+b) +f(2*k+b) +f((n-1)*k + ...

  10. hdu 1258 从n个数中找和为t的组合 (DFS)

    题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...