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. SGU 185 Two shortest 最短路+最大流

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21068 Yesterday Vasya and Petya qua ...

  2. Android系统软件卸载方法

    最简单直接的卸载方式当然是用Re文件浏览器进系统软件目录删除即可,其次是用LBE等工具卸载系统软件.不过发现系统软件卸载后还会有桌面图标,怎么都干不掉,真是匪夷所思啊!简直就打不死的小强 系统软件装在 ...

  3. JAVA敏捷开发环境搭建(转载)

    前面介绍了创业型软件公司的工作模式,这里详细介绍下如何实施,第一步是先要搭建环境,有了环境才能开展工作. 整个软件项目分为四个环境 开发本地环境.开发环境.测试环境.IDC环境.和传统C++开发不一样 ...

  4. 企业级账号更新app

    企业级账号 版本更新总结       参考:http://jingyan.baidu.com/article/a3aad71aa5fbfbb1fb0096b1.html 1.打包ipa,plist工具 ...

  5. 【转】Sublime text 3 中文文件名显示方框怎么解决

    引用自:http://www.zhihu.com/question/24029280 如图,中文文件名打开全是乱码,内容倒是装了converttoutf8没什么太大的问题. 这个是sublime te ...

  6. 禁用backspace键的后退功能

    禁用backspace键的后退功能,但是可以删除文本内容<script language="JavaScript">document.onkeydown = check ...

  7. lof基金

    lof基金 编辑 LOF基金,英文全称是"Listed Open-Ended Fund",汉语称为"上市型开放式基金".也就是上市型开放式基金发行结束后,投资者 ...

  8. 你必须知道的ADO.NET

    原文:http://www.cnblogs.com/liuhaorain/archive/2012/02/06/2340409.html 1. 什么是ADO.NET? 简单的讲,ADO.NET是一组允 ...

  9. LA 4256

    Traveling salesmen of nhn. (the prestigious Korean internet company) report their current location t ...

  10. lightoj 1408 Batting Practice (概率问题,求期望,推公式)

    题意:一个人若连续进k1个球或连续不进k2个球,游戏结束,给出这个人不进球的概率p(注意:是不进球!!!),求到游戏结束时这个投球个数的期望. 不进球概率为p,进概率 q=1-p.设 f[i] 表示连 ...