hdu2262 Where is the canteen
Where is the canteen
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1313 Accepted Submission(s): 384
move, he check front, back, left and right to see which of those four adjacent squares are free, and randomly walk to one of the free squares until landing on a canteen.
'@' is the start location. There is exactly one in each case.
'#' is an impassible square.
'$' is a canteen. There may be more than one in the campus.
'.' is a free square.
@$
2 2
@.
.$
1 3
@#$
4.000000
-1
/*
将点所有点令为1至n*m-1那么建立n*m个方程
对于一个任一个点En=(E1+E2+E3)/cnt+1; cnt为可以走的方向数 [0,4]
最后用高斯消元模版求解(用kuangbin的模版不知为什么这么慢)
而且餐厅有很多个
*/
#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; #define eps 1e-12
const int MAXN = 250;
char mp[20][20];
bool vis[20][20];
int n,m;
int sx,sy;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
struct Node{
int x,y;
}aa,bb;
queue<Node>q;
int temp[MAXN];
double a[MAXN][MAXN];
double x[MAXN];
int equ,var; inline int C(int x,int y){
return x*m+y;
}
bool Ok(int x,int y,int d){
if(d==0){
if(x>=0 && x<n && y>=0 && y<m && mp[x][y]!='#' && !vis[x][y]) return true;
}else {
if(x>=0 && x<n && y>=0 && y<m && mp[x][y]!='#' && vis[x][y]) return true;
}
return false;
}
void Bfs(){
int i,j,k;
while(!q.empty()){
bb=q.front(); q.pop();
for(i=0;i<4;i++){
aa.x=bb.x+dx[i];
aa.y=bb.y+dy[i];
if(Ok(aa.x,aa.y,0)){
vis[aa.x][aa.y]=1;
q.push(aa);
}
}
}
} void Makefunction(){
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
int cnt=0;
if(mp[i][j]=='#') continue;
if(mp[i][j]=='$'){
a[C(i,j)][C(i,j)]=1; continue;
}
for(k=0;k<4;k++){
int xx=i+dx[k];
int yy=j+dy[k];
if(Ok(xx,yy,1)){
cnt++; a[C(i,j)][C(xx,yy)]=1;
}
}
a[C(i,j)][C(i,j)]=-1*cnt;
x[C(i,j)]=-1*cnt;
}
}
int Gauss(){
int i,j,k,col,max_r; //max_r 指现在对哪一行操作 equ 方程数 var 未知数个数
for(k=0,col=0;k<equ && col<var;k++,col++){
max_r=k;
for(i=k+1;i<equ;i++)
if(fabs(a[i][col])>fabs(a[max_r][col])) max_r=k; //寻找这个未知数最大的一个
if(fabs(a[max_r][col])<eps) {
if(col==C(sx,sy)) return 0;
else continue;
}
if(k!=max_r){
for(j=col;j<var;j++) swap(a[k][j],a[max_r][j]);
swap(x[k],x[max_r]);
}
x[k]/=a[k][col];
for(j=col+1;j<var;j++) a[k][j]/=a[k][col];
a[k][col]=1;
for(i=0;i<equ;i++)
if(i!=k){
x[i]-=x[k]*a[i][col];
for(j=col+1;j<var;j++) a[i][j]-=a[k][j]*a[i][col];
a[i][col]=0;
}
}
return 1;
} int main(){
//freopen("in.txt","r",stdin);
int i,j,k;
while(~scanf("%d %d",&n,&m)){
q.empty();
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++) scanf("%s",mp[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++){
if(mp[i][j]=='@'){ sx=i; sy=j; }
if(mp[i][j]=='$'){ aa.x=i; aa.y=j; q.push(aa); vis[i][j]=1; }
}
Bfs();
memset(a,0,sizeof(a));
memset(x,0,sizeof(x));
Makefunction();
var=n*m; equ=n*m;
;
if(vis[sx][sy] && Gauss() ) printf("%lf\n",x[C(sx,sy)]);
else printf("-1\n");
}
return 0;
}
hdu2262 Where is the canteen的更多相关文章
- HDU-2262 Where is the canteen 概率DP,高斯消元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262 题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到cante ...
- HDU2262;Where is the canteen(高斯消元+期望)
传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...
- HDU 2262 Where is the canteen 期望dp+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...
- unknown directive "" in E:\canteen\nginx-1.16.0/conf/nginx.conf:3-------文本编辑器修改nginx配置文件的坑
nignx小白一个,今天在配置nginx的时候,理所当然的用了文本编辑器编辑并保存了一下nginx的nginx.conf配置文件,一不小心就折腾了几个钟. 保存之后就nginx -s reload一下 ...
- 1350. Canteen(map)
1350 这题没什么 就考一下map的用法吧 #include <iostream> #include<cstdio> #include<cstring> #in ...
- hdu2262 高斯消元
题目:有一个地图,一个人从某个点出发,问走到花园的期望步数为多少 设某点的期望步数为Ei. 那么目标的Ei=0. Ei=(Enext1+Enext2……Enextk)/k+1. 为什么是这个公式 因为 ...
- SQLServer------Join的使用方法
参考菜鸟教程网: http://www.runoob.com/sql/sql-join.html select a.Canteen,b.OrderNum,b.CreateTime,c.Name fro ...
- IELTS - Word List 28
1, The lawsuit is very much o the lawyer's mind. 2, The canteen was absolutely packed. 3, Doctors di ...
- Do things for others
早上,按照平常的时间去吃早饭,食堂格外的空旷,打饭的员工说今天人很少,我说昨天是有元旦晚会,她说今天是放假,我后来想,还是她说的更有道理.她看的比我清楚更清楚! 幸亏昨晚上记录下了早上要帮别人搜论文的 ...
随机推荐
- 《深入理解Java虚拟机》学习笔记(二)
垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...
- BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...
- weblogic修改jdk版本遇到的问题与解决方法
1.修改setDomainEnv ,路径.../domains/xx_domain\bin\ 1.1修改JAVA_HOME为需要修改的路径 注意:BEA_JAVA_HOME路径不需修改 2.修改路径后 ...
- JavaScript使用点滴
JavaScript使用点滴 一.字符串替换的小插曲 遇到一个小插曲,想要把后台返回的字符串输出给前端视图,字符串中包含\n换行,需要使用javascript对其进行替换成<br />. ...
- yum 安装 nfs,rpcbind 出现错误 libc.so.6(GLIBC_2.14)(64bit) is needed by
错误信息: Running rpm_check_debugERROR with rpm_check_debug vs depsolve:libc.so.6(GLIBC_2.14)(64bit) is ...
- 每个前端开发者必会的 20 个 JavaScript 面试题
JavaScript 未声明变量直接使用会抛出异常:var name is not defined,如果没有处理异常,代码就停止运行了.但是,使用typeof undeclared_variable并 ...
- 正"/" 和 反"\"的区别?
反斜杠"\"是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点.就是说,除了程序设计领域外,任何地方你都不应该有使用反斜杠的时候,请永远使用正斜杠"/" ...
- Linux下ACL权限控制以及用sudo设置用户对命令的执行权限
ACL权限分配 1.setfacl命令设置文件权限 setfacl -m u:user1:rw root.txt setfacl -m u:user2:rwx root.txt 2.getfacl命令 ...
- Docker安装weblogic
Docker容器安装weblogic详细教程 前提:已经安装后Docker,并且能正常使用 (1)获取镜像: docker pull ismaleiva90/weblogic12 docker pu ...
- java遍历的优化
说明:这是在面试中面试官出的题.虽然是常见的优化问题,但这种经验的确很有用.感慨之余,分享出来,以此共勉. 场景:现有List<PersonA>,List<PersonB>,P ...