ZJUT 地下迷宫 (高斯求期望)
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 地下迷宫 (高斯求期望)的更多相关文章
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- hdu 4870 rating(高斯消元求期望)
Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu4035 Maze (树上dp求期望)
dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...
- ZOJ 3822(求期望)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- sgu 495. Kids and Prizes (简单概率dp 正推求期望)
题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...
- HDU3853-LOOPS(概率DP求期望)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- PTA地下迷宫探索
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
随机推荐
- centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网
iptables防火墙扩展之layer7应用层访问控制 概述: iptables防火墙是工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙.以基于网络层的数据包过滤机制为主,同 ...
- 基于url拦截
- dynamic web module和对应的TOMCAT 版本
大致因为java的web系统有多种类型,比如静态的和动态的,然后动态的java web project要设置dynamic web module,也就是动态网页模型,他必须要和对应的服务器搭配好了才能 ...
- dispatchers 设置
Oracle连接方式(dispatchers 设置) oracle 响应客户端请求有两种方式: 1 专有连接:用一个服务器进程响应一个客户端请求 2 共享连接:用一个分派器(dispatcher)响应 ...
- LeetCode(34):搜索范围
Medium! 题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果 ...
- jquery----用户密码验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 区间dp好题cf149d 括号匹配
见题解链接https://blog.csdn.net/sdjzping/article/details/19160013 #include<bits/stdc++.h> using nam ...
- cf796c 树形,思维题
一开始以为是个树形dp,特地去学了..结果是个思维题 /* 树结构,设最大点权值为Max,则答案必在在区间[Max,Max+2] 证明ans <= Max+2 任取一个点作为根节点,那么去掉这个 ...
- winform连接oracle时Oracle.DataAccess.dll版本问题 Silverlight
1.通用TestOracle.zip部署到iis上,或直接运行程序测试当前全局程序集 protected void Button1_Click(object sender, EventArgs e) ...
- 使用k8s operator安装和维护etcd集群
关于Kubernetes Operator这个新生事物,可以参考下文来了解这一技术的来龙去脉: https://yq.aliyun.com/articles/685522?utm_content=g_ ...