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)的更多相关文章

  1. HDU 2102 A计划 (BFS)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. HDU 2102 A计划(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输 ...

  3. HDU - 2102 A计划 【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路 题目有两个坑点 0.Output 说 能在T时刻 找到公主 就输出 YES 但实际上 只要 ...

  4. hdu 2102 A计划(BFS,基础)

    题目 //要仔细写的BFS,着重对#穿越的处理哦: //花了几个小时终于把这道简单的BFS给弄好了,我果然还需要增加熟练度,需要再仔细一些: //代码有点乱,但我不想改了,,,,, #include& ...

  5. HDU 2102 A计划(三维BFS)

    这题太欢乐了......虽然wa了几次,但是想到骑士在两幅图的传送门中传来传去就觉得这骑士太坑了 #include <cstdio> #include <iostream> # ...

  6. HDU 2102 A计划(两层地图加时间限制加传送门的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  7. hdu 2102 A计划 具体题解 (BFS+优先队列)

    题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...

  8. hdu 2102 A计划

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...

  9. hdu 2102 A计划(双层BFS)(具体解释)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...

随机推荐

  1. 设计模式之状态模式(State)

    状态模式原理:随着状态的变化,对象的行为也发生变化 代码如下: #include <iostream> #include <string> #include <list& ...

  2. BZOJ3874 codevs3361 宅男计划

    AC通道1:http://www.lydsy.com/JudgeOnline/problem.php?id=3874 AC通道2:http://codevs.cn/problem/3361/ [题目分 ...

  3. 省选加油>_<

    今天没有写题诶……看了看以前的模板……明天就要省选了>_<加油~~ 要不再去打局dota吧>_>

  4. 【BZOJ】【1011】【HNOI2008】遥远的行星

    神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信 ...

  5. php中==与===区别

    ==是不判断二者是否是同一数据类型,而===是更为严格的比较,它不但要求二者值相等,而且还要求它们的数据类型也相同

  6. Unity使用外部版本控制SVN

    原地址:http://www.cnblogs.com/realtimepixels/p/3652146.html Using External Version Control Systems with ...

  7. Keil RTX systick 初始化

    在STM32F215上移植Keil的RTX操作系统,随便设置下就能好使,但是当我想知道systick到底是怎么设置的时候,就得翻翻代码了,原来在 rt_HAL_CM.h中以一个内联函数的形式定义的 _ ...

  8. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  9. poj 3469

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 18120   Accepted: 7818 ...

  10. POJ 1222

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6196   Accepted: 40 ...