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

    在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen  ##一直默认就可以了 3.将公钥加入到Github账户 ...

  2. C语言 给字符数组赋值的方法

    typedef struct _tagTESTCHAR { char szTest[30];}TESTCHAR , *PTESTCHAR; int main(int argc, char* argv[ ...

  3. Ubuntu下VIM的安装和基本用法

    1.用root账户登录Ubuntu,命令行中输入vim,如果未安装会得到下面的提示: 程序“vim”已包含在下列软件包中:  * vim  * vim-gnome  * vim-tiny  * vim ...

  4. java中值类型和引用类型的区别

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  5. 防止黑客对服务器IP地址的攻击

    下面的参数都是系统默认的: [root@ok etc]# cat /proc/sys/net/ipv4/conf/eth0/accept_source_route [root@ok etc]# cat ...

  6. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  7. PHP多文件上传类

    <?php class Upload{ var $saveName;// 保存名 var $savePath;// 保存路径 var $fileFormat = array('gif','jpg ...

  8. Maven跳过test打包

    1. cd到当前目录 2. mvn install -Dmaven.test.skip=true   参考:http://blog.csdn.net/symgdwyh/article/details/ ...

  9. GBK、GB2312、iso-8859-1之间的区别

    转自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国政 ...

  10. javascript优化--13模式1(DOM和浏览器模式)

    注意分离: 通过将CSS关闭来测试页面是否仍然可用,内容是否依然可读: 将JavaScript关闭来测试页面仍然可以执行正常功能:所有连接是否正常工作:所有的表单是否可以正常工作: 不使用内联处理器( ...