fzu 2124
#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的更多相关文章
- FZU 2124 FOJ 2124 吃豆人【BFS】
Problem 2124 吃豆人 Accept: 134 Submit: 575 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- FZU 2124 bfs+vis记录
第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了 然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具 每到一个地方 就 ...
- FZU 2124 吃豆人 bfs
题目链接:吃豆人 比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了.[此时先到的不一定就是时间最短的.]于是换dfs,WA. 赛后写了个炒鸡聪明的df ...
- FZU 2137 奇异字符串 后缀树组+RMQ
题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】
FZU 2105 Digits Count Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- FZU 2112 并查集、欧拉通路
原题:http://acm.fzu.edu.cn/problem.php?pid=2112 首先是,票上没有提到的点是不需要去的. 然后我们先考虑这个图有几个连通分量,我们可以用一个并查集来维护,假设 ...
- ACM: FZU 2107 Hua Rong Dao - DFS - 暴力
FZU 2107 Hua Rong Dao Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- ACM: FZU 2112 Tickets - 欧拉回路 - 并查集
FZU 2112 Tickets Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u P ...
随机推荐
- Makefile 实际用例分析(一) ------- 比较通用的一种架构
这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册 或者 点击打开链接 或者 跟我一起写Makefile( 陈皓 ) 这里说的是一般的实际的一个工程应该 ...
- vue-video-player视频播放插件
安装依赖 npm install vue-video-player -S 引入配置 //main.js import 'video.js/dist/video-js.css' import 'vue- ...
- Android Studio 常用快捷键(超实用!!!)
快捷键又称为“热键”,多个按键的组合可以实现某些快速操作,例如Window中最常用的Ctrl+C和Ctrl+V,熟练使用快捷键可以大大提高开发效率并可以减少某些错误的发生.Android Studio ...
- Coursera公开课-Machine_learing:编程作业8(2016-10-06 20:49)
Anomaly Detection and Recommender Systems 本周编程作业分为两部分:异常检测和推荐系统. 异常检测:本质就是使用样本的到特种值的gaussian分布,来预估正确 ...
- [转]Linux中set,env和export这三个命令的区别
转自:http://www.2cto.com/os/201306/223758.html Linux中set,env和export这三个命令的区别 set命令显示当前shell的变量,包括当前用户 ...
- 支付宝小程序日期选择组件datePicker封装
github 地址 https://github.com/iocool/antminDatePicker 最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS ...
- MyEclipse快捷键 (精简)
在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当需要恢复代码功能的时候,又可以用Ctrl+/ 去掉注释.这 ...
- Linux 一些小知识点汇总(持续更新....)
一.符号 1.$@:传递的参数. 2.$# :传递参数的数量. 3.$?:指上一次执行命令后的返回值.一般0表示运行成功. 补充:$?只表示上一个命令执行后的退出状态,当命令执行后,又执行了其他命令, ...
- Lazarus Reading XML- with TXMLDocument and TXPathVariable
也就是使用XPath的方式,具体语法规则查看http://www.w3school.com.cn/xpath/xpath_syntax.asp,说明得相当详细.这里列举例子是说明在Lazarus/FP ...
- Codeforces_731F_(前缀和)
F. Video Cards time limit per test 1 second memory limit per test 256 megabytes input standard input ...