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上安装一个独立绿色的视频 ...
随机推荐
- CLR via C#(16)--泛型
泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...
- C#回顾 - 2.NET的IO:Path、File、FileInfo、Directory、DirectoryInfo、DriveInfo、FileSystemWatcher
1.管理文件系统 一般而言,应用程序都会有保存数据.检索数据的需求. 1.1 使用 path 类来访问文件路径 [path常用的方法]:http://www.cnblogs.com/tangg ...
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)
1061: 从三个数中找出最大的数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 124[Submit][Status][We ...
- [LeetCode] Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- 攻城狮在路上(叁)Linux(十四)--- 查阅文件内容
常用命令:cat.tac.nl.more.less.head.tail.od... 一.直接查看文件内容:cat.tac.nl <==一次性全部读取 1.cat [-AbEnTv] 文件名 参数 ...
- 7-14 EXISTS子查询
EXISTS: 只注重于子查询是否有返回行,如果查有返回行返回结果为值,否则为假 并不使用子查询的结果,仅用于测试子查询是否有返回结果. 语法: IF EXISTS (子查询) BEGIN 语句块 E ...
- Win10 开发者模式开启
使用注册表方式:建立一个注册表DWORD为1键值:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowAllTrust ...
- Windows下Apache服务器中自动配置二级子域名
今天我们介绍的这个办法,只需要简单修改 httpd-vhosts.conf 文件,配合 .htaccess 文件即可实现自动配置二级域名. 我们这里以 wpchina.com 为例,以下代码中的 wp ...
- 从github下载某个git库的4种方法
转自:http://blog.csdn.net/feiniao1221/article/details/7516421 以gerrit-trigger-plugin为例,下面的链接都是从相应页面上直接 ...