XCOJ 1168 (搜索+期望+高斯消元法)
题目链接: http://xcacm.hfut.edu.cn/oj/problem.php?id=1168
题目大意:D是起点,E是终点。每次等概率往某个方向走,问到达终点的期望步数。到不了终点或步数超限输出tragedy!
解题思路:
如果某个点四周都不是障碍,不难有方程:
E(X,Y)= (1/4)E(X-1,Y)+ (1/4)E(X+1,Y)+ (1/4)E(X,Y-1)+ (1/4)E(X,Y+1)+1
变形为一般式,且系数化1:4*E(X,Y)-E(X-1,Y)- E(X+1,Y) - E(X,Y-1) - E(X,Y+1) = 4
更一般化,如果周围有cnt个点可去: cnt*E(X,Y)-E(X-1,Y)- E(X+1,Y) - E(X,Y-1) - E(X,Y+1) = cnt
对于不可达点(不一定是障碍)或终点:E(X,Y)= 0,这一步的处理很重要,不然会导致出现自由变元,导致无穷解。
那么本题思路很明显了:
①BFS或是DFS,标记各点的可达情况。
②对于每个点(元),首先看其是否为不可达点或是终点,令其系数为1后continue
如果不是,枚举四个方向,系数设为-1。最后该点系数为cnt,解向量初始化为cnt。
③高斯消元(本模板是高斯—约当消元法)。
④由于方程是把起点和终点逆过来列方程的,所以元[起点]的解才是最后的ans。(类似记忆化搜索的方式)
#include "cstdio"
#include "queue"
#include "cstring"
#include "algorithm"
#include "math.h"
using namespace std;
#define eps 1e-15
char map[][],s[];
int n,m,T,sx,sy,ex,ey,vis[][],dir[][]={-,,,,,-,,},equ;
double ratio[][];
struct status
{
int x,y;
status(int x,int y):x(x),y(y) {}
};
void Bfs(int x,int y)
{
queue<status> Q;Q.push(status(x,y));
vis[x][y]=;
while(!Q.empty())
{
status t=Q.front();Q.pop();
for(int s=;s<;s++)
{
int X=t.x+dir[s][],Y=t.y+dir[s][];
if(X<||Y<||X>=n||Y>=m||vis[X][Y]||map[X][Y]=='X') continue;
vis[X][Y]=;
Q.push(status(X,Y));
}
}
}
void Reset()
{
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if((i==ex&&j==ey)||!vis[i][j]) {ratio[i*m+j][i*m+j]=;continue;}
int cnt=;
for(int s=;s<;s++)
{
int x=i+dir[s][],y=j+dir[s][];
if(x>=&&y>=&&x<n&&y<m&&map[x][y]=='.')
{
ratio[i*m+j][x*m+y]=-;
cnt++;
}
}
ratio[i*m+j][equ]=ratio[i*m+j][i*m+j]=cnt;
}
}
bool Gauss()
{
for(int i=;i<equ;i++)
{
int k=i;
for(int j=i;j<equ;j++)
if(fabs(ratio[j][i])>fabs(ratio[k][i])) k=j;
swap(ratio[k],ratio[i]);
if(fabs(ratio[i][i])<eps) return false;
for(int j=i+;j<=equ;j++) ratio[i][j]/=ratio[i][i];
for(int j=;j<equ;j++)
if(i!=j)
for(int k=i+;k<=equ;k++) ratio[j][k]-=ratio[j][i]*ratio[i][k];
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
equ=n*m;
for(int i=;i<n;i++)
{
scanf("%s",&s);
for(int j=;j<strlen(s);j++)
{
map[i][j]=s[j];
if(s[j]=='D') {map[i][j]='.';sx=i;sy=j;}
if(s[j]=='E') {map[i][j]='.';ex=i;ey=j;}
}
}
Bfs(sx,sy);
Reset();
bool ok=Gauss();
if(ok&&ratio[sx*n+sy][equ]<=) printf("%.2lf\n",ratio[sx*n+sy][equ]);
else printf("tragedy!\n");
memset(ratio,,sizeof(ratio));
memset(vis,,sizeof(vis));
}
}
2709 | 2013217098 | Accepted |
1148
|
88
|
C++ | 2668 B | 2014-11-06 20:51:07 |
XCOJ 1168 (搜索+期望+高斯消元法)的更多相关文章
- BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1640 Solved: 962 Description I ...
- BZOJ 1415: [Noi2005]聪聪和可可(记忆化搜索+期望)
传送门 解题思路 还是比较简答的一道题.首先\(bfs\)把每个点到其他点的最短路求出来,然后再记忆化搜索.记搜的时候猫的走法是确定的,搜一下老鼠走法就行了. 代码 #include<iostr ...
- 搜索系统核心技术概述【1.5w字长文】
前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- C语言算法动态规划板子题汇总
本篇博客仅为对动态规划基础问题的状态转移方程进行求解,然后给出对应的注释代码,有关题目的具体内容可在算法导论或网络上进行查看 目录 1.钢管切割(最小值) 2.两条流水线调度 3.多条流水线调度 4. ...
- SmokeTest测试流程
没办法了,本来是表格,但是粘贴不过来 测试目的: 用于检测该版本在基本的应用场景下,基本的功能是否满足. 测试前提: 发货版本 示例:ATV9冒烟测试测试项解读 表格获取:Google ATV hel ...
- OBST(最优二叉搜索树)
简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...
- Homebrew命令总结
brew又叫homebrew,是macos上的一个包管理工具,能够在mac中方便的进行包管理,类似于ubuntu系统下的apt-get,记得自己第一次接触brew是为了在mac上安装一个独立绿色的视频 ...
随机推荐
- 关闭 Visual Studio 2013 的 Browser Link 功能
最近公司弄新项目需要用 MVC,就把 IDE 升级到了 Visual Studio 2013,在开发的时候发现有好多请求一个本地49925的端口 . 很奇怪,一开始以为是 Visual Studio ...
- (1)Underscore.js入门
1. Underscore对象封装 Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文中称"Undersco ...
- Java Hour 65 [译] Java 6.0 说明
原文可爱的地址: http://www.javabeat.net/introduction-to-java-6-0-new-features-part-i/ 该文字2007年的,现在估计老掉牙了,但是 ...
- WPF ListView展示层叠信息
通常我们在ListView中展示一列同类数据,例如城市名称.不过可以对ListView的DataTemplate稍作修改,让其显示层叠信息.例如:需要在ListView中显示省份和省份对应的城市名称. ...
- git checkout 命令详解
转自:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_me ...
- 第二十篇:在SOUI中使用分层窗口
从Windows 2K开始,MS为UI开发引入了分层窗口这一窗口风格.使用分层窗口,应用程序的主窗口可以是半透明,也可以是逐点半透明(即每一个像素点的透明度可以不同). 可以说,正是因为有了分层窗口, ...
- [荐]js模版引擎handlebars.js
[官方介绍:http://handlebarsjs.com/] Handlebars provides the power necessary to let you build semantic te ...
- css样式—字体垂直、水平居中
“来,老板娘,给个div瞅瞅”: “好的,宇哥,来了了了”: <div class="tt">啦啦啦</div> “给各样啊,我去”: “是”: .tt{ ...
- 理解是最好的记忆方法 之 CSS中a链接的④个伪类为何有顺序
理解是最好的记忆方法 之 CSS中a链接的④个伪类为何有顺序 在CSS中,a标签有4种伪类,分别为: a:link, a:visited, a:hover, a:active 对其稍有了解的前端er都 ...
- 单机c1000k连接
单机c1000k连接即单机实现百万连接,首先要注意的是连接是虚拟的逻辑的,连接最终落于 网卡,清晰概念才能更深入更清晰的想出问题的解决办法. 参考 http://www.ideawu.net/blog ...