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[ ...
随机推荐
- VS2010 error C3861: “exit”: 找不到标识符
#include <stdlib.h> 可以解决问题
- eclipse 和 android studio 快捷键对比
操作 studio eclipse debug/run 计算变量值 alt+F8 ctrl+shift+I 跳到下一步 F8 F6 跳到下一个断点 shift+F8 F8 进入到代码 F7 F5 ...
- svn status 显示 ~xx
“~” 版本控制下的项目与其它类型的项目重名
- date +%s 能打印出自1970-01-01 00:00:00到当前时间的秒数
[root@bass Desktop]# date +%s 1466561580 [root@bass Desktop]# python Python 2.6.6 (r266:84292, Jul 2 ...
- 深入理解 KVC\KVO 实现机制 — KVO
KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文. KVC实现机制传送门 KVO概述 键值观察Key-Value-Ob ...
- 动态设置form表单的元素值
因为经常用到的功能,所以我想到封装一个函数,用起来更方便快捷.. 先来看效果图如下: var data = {a:'aaaa', b:'2', 'c':[1,2,4]} 这就相当于 ajax 返回的j ...
- Android 在资源文件(res/strings.xml)定义一维数组,间接定义二维数组
经常我们会在资源文件(res/strings.xml)定义字符串,一维数组,那定义二维数组?直接定义二维数组没找到,可以间接定义. 其实很简单,看过用过一次就可以记住了,一维数组估计大家经常用到,但是 ...
- win7家庭版更改桌面图标
电脑 Win7家庭普通版 方法/步骤 1 选择左下角开始. 2 在搜索栏中,输入“ico”,选择“显示或隐藏桌面上的通用图标”. 3 出现桌面图标设置,选择“更改图标”.
- Treap和名次树
Treap名字的来源:Tree+Heap,正如名字一样,就是一颗简单的BST,一坨堆的合体.BST的不平衡的根本原因在于基于左<=根<=右的模式吃单调序列时候会无脑成长链,而Treap则添 ...
- 产品原型设计工具 Balsamiq Mockups(转)
Balsamiq Mockups是产品设计师绘制线框图或产品原型界面的利器.在产品设计的需求阶段,低保真的线框图或者草图设计介于产品流程设计与高保真DEMO设计之间,在Balsamiq Mockups ...