FZU 2124 bfs+vis记录
第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了
然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具
每到一个地方 就朝四个方向都尝试一下能不能吃到 如果吃到了就更新ans
需要注意的是刚开始就要尝试四个方向
vis[2][25][25]的第一维记录道具状态
一开始认为图太小 不用vis 然而不用vis就会出现跳不出循环的状况
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
using namespace std;
char ma[25][25];
bool vis[2][25][25];///0 没有 1 有了
int n,m;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)
return true;
return false;
}
double ans;
struct node
{
int x;
int y;
double time;
bool daoju;
};
bool ok;
double find(int x,int y)
{
///1
double a=0.0;
int xx,yy;
xx=x;
yy=y;
while(xx>0)
{
xx--;
a+=0.2;
if(ma[xx][yy]=='X')
break;
if(ma[xx][yy]=='B')
{
ok=true;
return a;
}
}
a=0.0;
xx=x;
yy=y;
while(xx<n-1)
{
xx++;
a+=0.2;
if(ma[xx][yy]=='X')
break;
if(ma[xx][yy]=='B')
{
ok=true;
return a;
}
}
a=0.0;
xx=x;
yy=y;
while(yy>0)
{
yy--;
a+=0.2;
if(ma[xx][yy]=='X')
break;
if(ma[xx][yy]=='B')
{
ok=true;
return a;
}
}
a=0.0;
xx=x;
yy=y;
while(yy<m-1)
{
yy++;
a+=0.2;
if(ma[xx][yy]=='X')
break;
if(ma[xx][yy]=='B')
{
ok=true;
return a;
}
}
return 200.0;
}
void bfs(int x,int y)
{
vis[0][x][y]=false;
node a;
a.x=x;
a.y=y;
a.time=0.0;
a.daoju=false;
double aa=find(a.x,a.y);
if(aa<150.0)
{
double b=aa+a.time;
if(b<ans)
{
ans=b;
ok=true;
}
}
queue<node >q;
q.push(a);
while(!q.empty())
{
node b;
b=q.front();q.pop();
node c;
for(int i=0;i<4;i++)
{
c=b;
c.x+=dx[i];
c.y+=dy[i];
int v;
if(c.daoju==false)
v=0;
else v=1;
if(check(c.x,c.y)&&vis[v][c.x][c.y]==true)
{
if(ma[c.x][c.y]!='X')
{
vis[v][c.x][c.y]=false;
if(c.daoju==false)
c.time+=1.0;
else c.time+=0.5;
if(ma[c.x][c.y]=='B')
{
if(c.time<ans)
ans=c.time;
}
else if(ma[c.x][c.y]=='S')
{
c.daoju=true;
double a=find(c.x,c.y);
if(a<150.0)
{
ok=true;
double b=a+c.time;
if(b<ans)
ans=b;
}
q.push(c);
}
else
{
double a=find(c.x,c.y);
if(a<150.0)
{
ok=true;
double b=a+c.time;
if(b<ans)
ans=b;
}
q.push(c);
}
}
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m))
{
memset(vis,true,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%s",ma[i]);
}
ok=false;
ans=9999.0;
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(ma[i][k]=='P')
{
bfs(i,k);
if(ok)
printf("%.1f\n",ans);
else printf("-1\n");
}
}
}
}
}
FZU 2124 bfs+vis记录的更多相关文章
- FZU 2124 FOJ 2124 吃豆人【BFS】
Problem 2124 吃豆人 Accept: 134 Submit: 575 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- FZU 2124 吃豆人 bfs
题目链接:吃豆人 比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了.[此时先到的不一定就是时间最短的.]于是换dfs,WA. 赛后写了个炒鸡聪明的df ...
- FZU 2092 bfs+记忆化搜索
晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...
- poj--3984--迷宫问题(bfs+路径记录)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status D ...
- HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)
bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...
- FZU 2028 BFS+vector
一个普通的bfs 如果不看样例和input的解释... 四个0真是神样例 又被input误导 以为每个点都按顺序有标号 传送门的终点给的是一个点的标号 然后结果是什么呢?无尽的runtime erro ...
- poj 3984 迷宫问题【bfs+路径记录】
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10103 Accepted: 6005 Description ...
- FZU - 2150 bfs [kuangbin带你飞]专题一
题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...
- BFS 路径记录
有一迷宫 N*M,要求输出可通行的最短路径. 可以先倒着 BFS 一遍迷宫,这样 dis[] 数组储存的就是各点到迷宫终点的最短距离. 然后再从起点开始 BFS 一遍 dis[] ,只要满足 dis[ ...
随机推荐
- [Android Pro] android 混淆文件project.properties和proguard-project.txt
参考文档:http://blog.csdn.net/xueyepiaoling/article/details/8202359转载自:http://glblong.blog.51cto.com/305 ...
- sublime text3侧边栏主题不生效问题解决
sublime text3主题插件: Seti_UI 插件安装: 在线安装:需要FQ window: ctrl+shift+p 找install package:之后搜索 Seti_UI 安装完成后需 ...
- 查看nginx版本号
# ./nginx -v Tengine version: Tengine/ (nginx/)
- ASP.NET MVC那些事
MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...
- CI中自定义SQL查询,LIKE模糊查询的处理
参考: /** * 据用户输入的关键字查询相册信息;照片墙搜索框功能 * @param $keyWord 关键字 * @param $pageNum 页码,第几页 * @param $pageSize ...
- .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串
1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...
- hdu 1756 判断点在多边形内 *
模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...
- poj 2594 传递闭包+最大路径覆盖
由于路径可以有重复的点,所以需要将间接相连的点连接 #include<stdio.h> #include<string.h> #include<algorithm> ...
- SURF算法与源码分析、下
上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV中的源码分析,这篇文章接着上篇文章对已经定位到的SURF特征点进行特征描述.这一步至关重要,这是SU ...
- loj 1018(状压dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25844 思路:首先预处理出点在同一直线上的所有的点集状态(dp[i ...