题目链接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. 二、JavaScript语言--JS实践--倒计时效果

    主要内容:分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计效果. Javascript 日期对象: Date()返回当前的日期和时间 getY ...

  2. service(启动方式)

  3. android:installLocation = "auto" 的用法

    在Froyo(android 2.2,API Level:8)中引入了android:installLocation.通过设置该属性可以使得开发者以及用户决定程序的安装位置. android:inst ...

  4. windows消息机制(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

  5. Centos 上使用Mono+MVC5+WebApi+Sqlite

    鉴于现在网上很多Mono安装Jexus的方法已经过时,你打开百度搜索基本是几个前辈写的文字,很多其实是过去式了.踩的坑多自然使人望而生畏,而方便快捷的方法百度排名却太低,这里就安利下笔者刚成功使用的方 ...

  6. phpcms V9实现wap上一篇、下一篇功能

    在phpcms\modules\wap\index.php里面,搜索上面这句 if(!$r || $r['status'] != 99) showmessage(L('info_does_not_ex ...

  7. Python3 基本数据类型注意事项

    Python3 基本数据类型 教程转自菜鸟教程:http://www.runoob.com/python3/python3-data-type.html Python中的变量不需要声明.每个变量在使用 ...

  8. C++读取txt文件

    1. 逐行读入 void readTxt(string file) { ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 asser ...

  9. Unity3D打Box游戏

    先学习一些基本的脚本实现: 1.动态创建物体.默认位置是(0,0)位置 GameObject goNew = GameObject.CreatePrimitive(PrimitiveType.Cube ...

  10. WEB前端知识体系脑图

    说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...