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

Problem Description
After a long drastic struggle with himself, LL decide to go for some snack at last. But when steping out of the dormitory, he found a serious problem : he can't remember where is the canteen... Even worse is the campus is very dark at night. So, each time he
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.
 
Input
Each case begin with two integers n and m ( n<=15,m<=15 ), which indicate the size of the campus. Then n line follow, each contain m characters to describe the map. There are 4 different type of area in the map:

'@' 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.

 
Output
Output the expected number of moves required to reach a canteen, which accurate to 6 fractional digits. If it is impossible , output -1.
 
Sample Input
1 2
@$
2 2
@.
.$
1 3
@#$
 
Sample Output
1.000000
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的更多相关文章

  1. HDU-2262 Where is the canteen 概率DP,高斯消元

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262 题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到cante ...

  2. HDU2262;Where is the canteen(高斯消元+期望)

    传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...

  3. 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 ...

  4. unknown directive "" in E:\canteen\nginx-1.16.0/conf/nginx.conf:3-------文本编辑器修改nginx配置文件的坑

    nignx小白一个,今天在配置nginx的时候,理所当然的用了文本编辑器编辑并保存了一下nginx的nginx.conf配置文件,一不小心就折腾了几个钟. 保存之后就nginx -s reload一下 ...

  5. 1350. Canteen(map)

    1350 这题没什么  就考一下map的用法吧 #include <iostream> #include<cstdio> #include<cstring> #in ...

  6. hdu2262 高斯消元

    题目:有一个地图,一个人从某个点出发,问走到花园的期望步数为多少 设某点的期望步数为Ei. 那么目标的Ei=0. Ei=(Enext1+Enext2……Enextk)/k+1. 为什么是这个公式 因为 ...

  7. SQLServer------Join的使用方法

    参考菜鸟教程网: http://www.runoob.com/sql/sql-join.html select a.Canteen,b.OrderNum,b.CreateTime,c.Name fro ...

  8. IELTS - Word List 28

    1, The lawsuit is very much o the lawyer's mind. 2, The canteen was absolutely packed. 3, Doctors di ...

  9. Do things for others

    早上,按照平常的时间去吃早饭,食堂格外的空旷,打饭的员工说今天人很少,我说昨天是有元旦晚会,她说今天是放假,我后来想,还是她说的更有道理.她看的比我清楚更清楚! 幸亏昨晚上记录下了早上要帮别人搜论文的 ...

随机推荐

  1. 《Thinking in Java》学习笔记(七)

    1.关于反射还有一些需要补充的 package reflect; public class HiddenClass { public A HiddenA(){ return new A(); } } ...

  2. 原生js贪吃蛇

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...

  3. Mac通过brew安装reds、memcached

    redis brew install php70-redis 配置文件: /usr/local/etc/php/7.0/conf.d/ext-redis.ini memcached brew inst ...

  4. Mac 系统安装 oh my zsh

    先来张图感受一下: 安装oh my zsh: 1.克隆这个项目到本地(前提是你得有装git) git clone git://github.com/robbyrussell/oh-my-zsh.git ...

  5. Mac下PyCharm快捷键大全

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  6. bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆

    [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2727  Solved: 1099[Submit][Stat ...

  7. linux开放80 端口

    1.使用su登录管理员用户 2.编辑防火墙配置文件 vim /etc/sysconfig/iptables 3.在里面加入后保存 #open port 80 -A INPUT -p TCP -m st ...

  8. Spring实现无需注解实现自动注入

    xml配置 过程:设置自动装配的包-->使用include-filter过滤type选择为regex为正则表达式-->expression是表达是式也就是限制条件 <?xml ver ...

  9. java中public private protected default的区别

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  10. java并发 - 自底向上的原理分析

    [TOC] 事先声明,我只是java并发的新手,这篇文章也只是我阅读<java并发编程的艺术>一书(内容主要涉及前3章)的一些总结和感悟.希望大家能多多讨论,对于错误的地方还请指出. 0. ...