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. 【NOI模拟赛(湖南)】DeepDarkFantasy

    DeepDarkFantasy 从东京出发,不久便到一处驿站,写道:日暮里.  ——鲁迅<藤野先生> 定义一个置换的平方为对1~n的序列做两次该置换得到的序列.已知一个置换的平方,并且这个 ...

  2. SQL SERVER 导出到Oracle 问题与技巧

    工具: 使用SQL SERVER自带的导入, 导出工具   技巧: 一. 使用Oracle Provider for OLE DB(强制推荐) 1. 速度快 2. 要安装Oracle驱动(Oracle ...

  3. HDU1056 HangOver

    HangOver Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descript ...

  4. 【ASP.Net MVC】AspNet Mvc一些总结

    AspNet Mvc一些总结 RestaurantReview.cs using System; using System.Collections.Generic; using System.Comp ...

  5. HTML页面加载和解析流程详细介绍

    浏览器加载和渲染html的顺序 1. IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元 ...

  6. Android Environment FAQ (Frequently Asked Question)

    1.how to find out the Eclipse Version From Eclipse Menu Help ----> About Eclipse It displayed as ...

  7. Android开发者:你真的会用AsyncTask吗?

    [导读]在Android应用开发的过程中,我们需要时刻注意保证应用程序的稳定和UI操作响应及时,因为不稳定或响应缓慢的应用将给应用带来不好的印象,严重的用户卸载你的APP,这样你的努力就没有体现的价值 ...

  8. HDU 2671 Can't be easier(数学题,点关于直线对称)

    题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...

  9. Vi的使用

    Vi的使用: 范例一: 使用Vi进入一般模式: [root@dsetl lp]# vi test1.txt 范例二:按下i键进入编辑模式,开始编辑文字 -- INSERT – 范例三:按下[ESC]键 ...

  10. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...