第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合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记录的更多相关文章

  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

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

  3. FZU 2092 bfs+记忆化搜索

    晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...

  4. poj--3984--迷宫问题(bfs+路径记录)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  5. HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)

    bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...

  6. FZU 2028 BFS+vector

    一个普通的bfs 如果不看样例和input的解释... 四个0真是神样例 又被input误导 以为每个点都按顺序有标号 传送门的终点给的是一个点的标号 然后结果是什么呢?无尽的runtime erro ...

  7. poj 3984 迷宫问题【bfs+路径记录】

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10103   Accepted: 6005 Description ...

  8. FZU - 2150 bfs [kuangbin带你飞]专题一

    题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...

  9. BFS 路径记录

    有一迷宫 N*M,要求输出可通行的最短路径. 可以先倒着 BFS 一遍迷宫,这样 dis[] 数组储存的就是各点到迷宫终点的最短距离. 然后再从起点开始 BFS 一遍 dis[] ,只要满足 dis[ ...

随机推荐

  1. Android之数据库操作

    安卓数据库帮助类 /** * 数据库帮助类,用于管理数据库 * @author Administrator * */ public class PersonSQLiteOpenHelper exten ...

  2. .net学习笔记---HttpRuntime类

    HttpRuntime在ASP.NET处理请求中负责的是创建HttpContext对象以及调用HttpApplicationFactory创建HttpApplication. 其定义如下: publi ...

  3. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  4. sql经典习题及其答案(纠正错误版)

    --网上有好多这套题的答案,但是经过我的验证,有很多都是错的,误人子弟--这是我自己纠正以后的版本 然后呢如果我写的还有不对的欢迎批评指正!--(1)查询2006年以后(包括2006年)的投稿情况,列 ...

  5. Windows Server 2008 R2遗忘管理员密码后的解决方案

    在日常的工作中,对于一个网络管理员来讲最悲哀的事情莫过于在没有备用管理员账户和密码恢复盘的情况下遗忘了本地管理员账户密码. 在早期的系统中,遇到这种事情可以使用目前国内的很多Windows PE光盘来 ...

  6. Win8怎么查看IP地址

    win8查看自己IP地址方法一:查看本地网络法 1.首先从桌面右下角的“网络连接图标上”点击右键,然后选择打开网络和共享中心,如下图所示: 打开win8网络和共享中心 2.之后在打开的网络和共享中心窗 ...

  7. HDU1116 Play on Words(有向图欧拉通路)

    我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路.. 这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了. 有向图包含欧拉通路的充要条件是:首先基图连通,然后是 ...

  8. Android view 的事件分发机制

    1 事件的传递顺序是 Activity -> Window -> 顶层View touch 事件产生后,最先由 activity 的 dispatchTouchEvent 处理 /** * ...

  9. AMPPZ2014

    [AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d, ...

  10. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...