题目链接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 (搜索+期望+高斯消元法)的更多相关文章

  1. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  2. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  3. BZOJ 1415: [Noi2005]聪聪和可可(记忆化搜索+期望)

    传送门 解题思路 还是比较简答的一道题.首先\(bfs\)把每个点到其他点的最短路求出来,然后再记忆化搜索.记搜的时候猫的走法是确定的,搜一下老鼠走法就行了. 代码 #include<iostr ...

  4. 搜索系统核心技术概述【1.5w字长文】

    前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...

  5. 背包dp整理

    01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...

  6. C语言算法动态规划板子题汇总

    本篇博客仅为对动态规划基础问题的状态转移方程进行求解,然后给出对应的注释代码,有关题目的具体内容可在算法导论或网络上进行查看 目录 1.钢管切割(最小值) 2.两条流水线调度 3.多条流水线调度 4. ...

  7. SmokeTest测试流程

    没办法了,本来是表格,但是粘贴不过来 测试目的: 用于检测该版本在基本的应用场景下,基本的功能是否满足. 测试前提: 发货版本 示例:ATV9冒烟测试测试项解读 表格获取:Google ATV hel ...

  8. OBST(最优二叉搜索树)

    简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...

  9. Homebrew命令总结

    brew又叫homebrew,是macos上的一个包管理工具,能够在mac中方便的进行包管理,类似于ubuntu系统下的apt-get,记得自己第一次接触brew是为了在mac上安装一个独立绿色的视频 ...

随机推荐

  1. ****php:require_once(dirname(__FILE__)."/./config_uc.php");

    Q:麻烦清楚地讲解一下这句的意思,具体路径是怎样的,这个文解在 根目录,如果我想放在根目录下的tieba文件夹里,应该怎么修改/./ 这个是表示什么? A: require_once(dirname( ...

  2. ExcelReport第一篇:使用ExcelReport导出Excel

    导航 目   录:基于NPOI的报表引擎——ExcelReport 下一篇:ExcelReport源码解析 概述 本篇将通过导出学生成绩的示例演示“使用ExcelReport导出Excel”的步骤. ...

  3. 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

    一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...

  4. 图结构练习——最小生成树(kruskal算法(克鲁斯卡尔))

    图结构练习——最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  有n个城市,其中有些城市之间可以修建公路,修建不同的公 ...

  5. iOS static

    获得20条news 先实现,再提取到business 层. The static Keyword You can have a local variable retain its value thro ...

  6. 验证备份前设置CONFIGURE CONTROLFILE AUTOBACKUP ON/OFF; 的区别

    关于rman的,环境: oracle 10.2.0 rman nocatalog方式 1.首先设置 CONFIGURE CONTROLFILE AUTOBACKUP ON; 然后进行数据库全备份 RM ...

  7. android 入门-关键词介绍

    1.@SuppressLint("HandlerLeak") 2.synchronized详解 http://www.cnblogs.com/GnagWang/archive/20 ...

  8. 实现一种快速查找Richedit中可见区域内OLE对象的方法

    Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...

  9. linux 操作mysql

    MySQL删除数据库时的错误 ERROR 1010 (HY000): Error dropping database (can't rmdir './myapp', errno: 39)的错误信息. ...

  10. java中的负数的问题

    在计算机中是使用二制数中的最高位表示来正负. 二进制的储存中都是用的补码,正数的原码.反码和补码相同,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1(重要!!) 首先得知道最高 ...