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[ ...
随机推荐
- C/C++函数参数读取顺序2
#include <stdio.h>int main(){ int a=1,b=3,c=3; printf("%d, %d, %d",(a++,b++,c++),b,c ...
- ListView滑动删除效果实现
通过继承ListView然后结合PopupWindow实现 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" ...
- php 正则表达式
<?php //正则表达式 //定界符:斜杠:/正则/ //匹配开始:^ //匹配结束:$ /*\d代表一个数字 \w代表一个单词 */ $zz = "/(13[0-9]|14[5|7 ...
- hdu 1150 最小点覆盖
题目大意;有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为 ...
- 理解ASP.NET 5的中间件
今天推荐的这篇文章,讲述了如何实现和使用ASP.NET 5的中间件. 虽然在ASP.NET 5中,微软没有再强调OWIN(Open Web Interface for .NET)及其微软官方的OWIN ...
- .NET Framework 4.6的新东西
我们知道.NET Framework 4.6即将随着Visual Studio 2015一同到来,目前依然是预览版.4.6和4,4.5,4.5.1和4.5.2是兼容的,也即安装4.6后会升级替代他们. ...
- C语言输出格式总结
转自:http://www.cnblogs.com/scbzljstudy/archive/2011/02/28/1966887.html 1 一般格式 printf(格式控制,输出表列) ...
- Hadoop_10_shuffle02_详解Shuffle过程【来源网络】推荐更为详细
网址:http://www.cnblogs.com/felixzh/p/4680808.html Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据, ...
- Eclipse+Tomcat部署项目的一些总结
1. eclipse运行web项目后, 默认保存到 workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps. ...
- SignalR —— Asp.net RealTime的春天
一般的例子:http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-gettin ...