hdu - 2102 A计划 (简单bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2102
题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以。
用一个3维字符数组存储图,另一个三维数组标记走过的点。每次遇到#号传送过去之后,都要判断传过去的点是否被访问过。
并且还要注意传过去是‘*’的情况,和传来传去的情况都可以不用考虑。
没注意细节,WA了几次。
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
char field[][][];
int used[][][];
int n,m,t;
int dir[][]={{-,},{,},{,-},{,}};
struct point
{
int z,x,y,time;
}; int bfs()
{
memset(used,,sizeof(used));
point s;
s.x=,s.y=,s.z=,s.time=;
queue<point>que;
que.push(s);
used[s.z][s.x][s.y]=;
while(!que.empty())
{
point e=que.front();
que.pop();
// printf("%d %d %d %d\n",z,e.x,e.y,e.time);
if(field[e.z][e.x][e.y]=='P'&&e.time<=t) return ;
for(int i=;i<;i++)
{
s=e;
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
if(!used[s.z][s.x][s.y]&&s.x>=&&s.x<n&&s.y>=&&s.y<m&&field[s.z][s.x][s.y]!='*')
{
if(field[s.z][s.x][s.y]=='#')
{
s.z^=;
if(used[s.z][s.x][s.y]) continue;
}
used[s.z][s.x][s.y]=;
s.time++;
que.push(s);
}
}
}
return ;
} int main()
{
//freopen("a.txt","r",stdin);
int c;
scanf("%d",&c);
while(c--)
{
scanf("%d%d%d",&n,&m,&t);
getchar();
for(int i=;i<;i++)
{
for(int j=;j<n;j++)
{
scanf("%s",field[i][j]);
// printf("%s\n",field[i][j]);
}
//getchar();
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(field[][i][j]=='#'&&field[][i][j]=='*') field[][i][j]='*';
if(field[][i][j]=='#'&&field[][i][j]=='*') field[][i][j]='*';
if(field[][i][j]=='#'&&field[][i][j]=='#') field[][i][j]=field[][i][j]='*';
}
// for(int i=0;i<2;i++)
// for(int j=0;j<n;j++)
// printf("%s\n",field[i][j]);
if(bfs()) printf("YES\n");
else printf("NO\n");
}
return ;
}
因为并没要求求最快到达时间,并且n比较小,所以深搜也可以。
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
char field[][][];
int used[][][];
int n,m,t,flag;
int dir[][]={{-,},{,},{,-},{,}}; void dfs(int z,int x,int y,int time)
{
if(flag) return;
// printf("%d %d %d %d\n",z,x,y,time);
if(field[z][x][y]=='P'&&time<=t)
{
flag=;
printf("YES\n");
return;
}
else if(field[z][x][y]=='#')
{
int zz;
if(z==) zz=;
else zz=;
int xx=x;
int yy=y;
if(!used[zz][xx][yy]&&field[zz][xx][yy]!='*')
{
used[zz][xx][yy]=;
dfs(zz,xx,yy,time);
used[zz][xx][yy]=;
}
}
else
{
for(int i=;i<;i++)
{
int zz=z;
int xx=x+dir[i][];
int yy=y+dir[i][];
if(!used[zz][xx][yy]&&xx>=&&xx<n&&yy>=&&yy<m&&field[zz][xx][yy]!='*')
{
if(time+>t) continue;
else
{
used[zz][xx][yy]=;
dfs(zz,xx,yy,time+);
used[zz][xx][yy]=;
}
}
}
}
} int main()
{
//freopen("a.txt","r",stdin);
int c;
scanf("%d",&c);
while(c--)
{
scanf("%d%d%d",&n,&m,&t);
getchar();
for(int i=;i<;i++)
{
for(int j=;j<n;j++)
{
scanf("%s",field[i][j]);
// printf("%s\n",field[i][j]);
}
//getchar();
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(field[][i][j]=='#'&&field[][i][j]=='*') field[][i][j]='*';
if(field[][i][j]=='#'&&field[][i][j]=='*') field[][i][j]='*';
if(field[][i][j]=='#'&&field[][i][j]=='#') field[][i][j]=field[][i][j]='*';
}
// for(int i=0;i<2;i++)
// for(int j=0;j<n;j++)
// printf("%s\n",field[i][j])
memset(used,,sizeof(used));
flag=;
used[][][]=;
dfs(,,,);
if(!flag) printf("NO\n");
}
return ;
}
hdu - 2102 A计划 (简单bfs)的更多相关文章
- HDU 2102 A计划 (BFS)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2102 A计划(BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输 ...
- HDU - 2102 A计划 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路 题目有两个坑点 0.Output 说 能在T时刻 找到公主 就输出 YES 但实际上 只要 ...
- hdu 2102 A计划(BFS,基础)
题目 //要仔细写的BFS,着重对#穿越的处理哦: //花了几个小时终于把这道简单的BFS给弄好了,我果然还需要增加熟练度,需要再仔细一些: //代码有点乱,但我不想改了,,,,, #include& ...
- HDU 2102 A计划(三维BFS)
这题太欢乐了......虽然wa了几次,但是想到骑士在两幅图的传送门中传来传去就觉得这骑士太坑了 #include <cstdio> #include <iostream> # ...
- HDU 2102 A计划(两层地图加时间限制加传送门的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ...
- hdu 2102 A计划 具体题解 (BFS+优先队列)
题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...
- hdu 2102 A计划
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...
- hdu 2102 A计划(双层BFS)(具体解释)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...
随机推荐
- 设计模式之状态模式(State)
状态模式原理:随着状态的变化,对象的行为也发生变化 代码如下: #include <iostream> #include <string> #include <list& ...
- BZOJ3874 codevs3361 宅男计划
AC通道1:http://www.lydsy.com/JudgeOnline/problem.php?id=3874 AC通道2:http://codevs.cn/problem/3361/ [题目分 ...
- 省选加油>_<
今天没有写题诶……看了看以前的模板……明天就要省选了>_<加油~~ 要不再去打局dota吧>_>
- 【BZOJ】【1011】【HNOI2008】遥远的行星
神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信 ...
- php中==与===区别
==是不判断二者是否是同一数据类型,而===是更为严格的比较,它不但要求二者值相等,而且还要求它们的数据类型也相同
- Unity使用外部版本控制SVN
原地址:http://www.cnblogs.com/realtimepixels/p/3652146.html Using External Version Control Systems with ...
- Keil RTX systick 初始化
在STM32F215上移植Keil的RTX操作系统,随便设置下就能好使,但是当我想知道systick到底是怎么设置的时候,就得翻翻代码了,原来在 rt_HAL_CM.h中以一个内联函数的形式定义的 _ ...
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- poj 3469
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 18120 Accepted: 7818 ...
- POJ 1222
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6196 Accepted: 40 ...