#include<stdio.h>

#include<queue>

#include<math.h>

#include<algorithm>

#include<iostream>

#include<string.h>

using namespace std;

#define N 30

char map[N][N];

struct node {

double t;

int x,y,f;

friend bool operator<(node a,node b) {

           return a.t>b.t;

}

};

double  min(double a,double b) {

return a>b?b:a;

}

double max(double a,double b) {

return a>b?a:b;

}

int px,py,bx,by,n,m,visit[N][N],visits[N][N];

int dis[4][2]={1,0,-1,0,0,1,0,-1};

double ans;

int judge(int x,int y) {

 if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]!='X')

return 1;

 return 0;

}

void bfs() {

   int i,tstart,tend;

   memset(visit,0,sizeof(visit));

   memset(visits,0,sizeof(visits));//第二个数组用来记录获得加速器后的状态情况

   priority_queue<node>q;

   node cur,next;

   cur.x=px;cur.y=py;

   cur.t=0;

   cur.f=0;

   visit[px][py]=1;

   q.push(cur);

   while(!q.empty()) {//对时间用优先队列

    cur=q.top();

q.pop();

if(cur.x==bx)  {//

tstart=min(cur.y,by);

tend=max(cur.y,by);

for(i=tstart;i<=tend;i++) 

 if(map[cur.x][i]=='X')

 break;

 if(i==tend+1) 

 ans=min(ans,(tend-tstart)*0.2+cur.t);

}

if(cur.y==by) {//判断伸舌头是否能吃掉

    tstart=min(cur.x,bx);

tend=max(cur.x,bx);

for(i=tstart;i<=tend;i++) 

if(map[i][cur.y]=='X')

break;

if(i==tend+1) 

 ans=min(ans,(tend-tstart)*0.2+cur.t);



for(i=0;i<4;i++) {

      int  x=next.x=cur.x+dis[i][0];

 int y=next.y=cur.y+dis[i][1];

 if(judge(x,y)) {

 if(cur.f==0&&visit[x][y])continue;//

 if(cur.f&&visits[x][y])continue;//有一个不符合就跳过

 if(x==bx&&y==by) {//出口

              ans=min(ans,cur.t+0.2);

 printf("%.1f\n",ans);

 return ;

 }

 if(cur.f==1) {

          next.t=cur.t+0.5;

          next.f=1;

 }

          else {

     next.t=cur.t+1;

 next.f=0;

 }

 if(map[x][y]=='S') {

             next.f=1;

map[x][y]='.';

 }

if(next.f==1)

visits[x][y]=1;

else

visit[x][y]=1;

 q.push(next);

 }

}

   }

   printf("-1\n");

   return ;

}

int main() {

int i,j;

while(scanf("%d%d",&n,&m)!=EOF) {

          for(i=1;i<=n;i++)

 scanf("%s",map[i]+1);

 for(i=1;i<=n;i++) 

 for(j=1;j<=m;j++) {

             if(map[i][j]=='P') 

px=i,py=j;

if(map[i][j]=='B')

bx=i,by=j;

 }

ans=999999999;

         bfs();

}

return 0;

}

fzu 2124的更多相关文章

  1. FZU 2124 FOJ 2124 吃豆人【BFS】

     Problem 2124 吃豆人 Accept: 134    Submit: 575 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  2. FZU 2124 bfs+vis记录

    第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了 然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具 每到一个地方 就 ...

  3. FZU 2124 吃豆人 bfs

    题目链接:吃豆人 比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了.[此时先到的不一定就是时间最短的.]于是换dfs,WA. 赛后写了个炒鸡聪明的df ...

  4. FZU 2137 奇异字符串 后缀树组+RMQ

    题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...

  5. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  6. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  7. FZU 2112 并查集、欧拉通路

    原题:http://acm.fzu.edu.cn/problem.php?pid=2112 首先是,票上没有提到的点是不需要去的. 然后我们先考虑这个图有几个连通分量,我们可以用一个并查集来维护,假设 ...

  8. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  9. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

随机推荐

  1. ural 1017. Staircases(dp)

    http://acm.timus.ru/problem.aspx?space=1&num=1017 题意:有n块砖,要求按照严格递增的个数摆放成楼梯,求楼梯的摆放种类数. 思路:状态转移方程: ...

  2. [Swift通天遁地]二、表格表单-(18)快速应用多种预定义格式的表单验证

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. sql case when 用法

    sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.            例如,下面的语句显示中文年月         select  ...

  4. leetCode----day02---- 买卖股票的最佳时机 II

    要求: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...

  5. sql数据库中常用连接

    很简单的知识点,今天有点搞不清楚左外连接,右外连接:详见以下: --表stu id name 1, Jack 2, Tom 3, Kity 4, nono --表exam id grade 1, 56 ...

  6. django 菜单权限

    一.什么是权限 能做哪些事情,不能做哪些事情,可以做的权限 二.设计权限 思路: web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制. ...

  7. JVM 内存分配和垃圾回收(GC)机制

    一  判断对象是否存活 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“活着”,哪些已经"死去”,即不能再被任何途径使用的对象. 1.1 引用计数法 (Reference ...

  8. Android 从服务器获取时间戳转换为年月日

    用JAVA相关类转换.代码如下: Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(NumberUtils.ge ...

  9. 编写第一个HTML5文件

    1.3.1  HTML文件的编写方法 编写HTML文件主要有如下3种方法: 手工直接编写 由于HTML语言编写的文件是标准的ASCII文本文件,所以我们可以使用任何的文本编辑器来打开并编写HTML文件 ...

  10. 02--Tomcat总体结构分析一

    注:此文章大部分参考大神文档,并且结合自身理解,补充了其他相关知识,谢绝转载.      大神原文地址链接:http://www.ibm.com/developerworks/cn/java/j-lo ...