hdu 2102 A计划(双层BFS)(具体解释)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到还有一层的相对位置,但假设被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中仅仅能前后左右移动,每移动一格花1时刻。层间的移动仅仅能通过时空传输机,且不须要不论什么时间。
1
5 5 14
S*#*.
.#...
.....
****.
...#. ..*.P
#.*..
***..
...*.
*.#..
YES
比較坑的地方:
/*1.碰到'#'传送们必传送,没有另外一种选择。
2.有可能起点和终点在同一层,例子是分别在两层里。起点和终点能够在随意的位置。
3.两边都是传送门时,或者一边是传送门一边是墙时,这两种情况是死路。
4.输入时要注意两张地图间有空行,要特殊处理。
*/
代码例如以下:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define M 17
int xx[4]={1,0,0,-1};
int yy[4]={0,1,-1,0};
int x,y,z;
int n, m, ttime;
char map[2][M][M];
int vis[2][M][M];//标记
struct node
{
int x, y, z;
int Time;
};
//q.push(front);
void bfs()
{
int i;
int dx, dy, dz;
queue<node>q;
node front, rear;
memset(vis,0,sizeof(vis));
front.x = x,front.y=y,front.z=z;
front.Time = 0;
vis[z][x][y] = 1;
q.push(front);//若这个定义在外面则必须每次清空
while(!q.empty())
{
front = q.front();
q.pop();
for(i = 0; i < 4; i++)
{
dx = front.x+xx[i];
dy = front.y+yy[i];
dz = front.z;
//推断是否越界,目标点是否为墙,是否超时
if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dz][dx][dy]
&&map[dz][dx][dy]!='*'&&front.Time<ttime)
{
if(map[dz][dx][dy]=='#' && !vis[dz][dx][dy])
{//表示遇到传送器的情况
vis[dz][dx][dy] = 1;
if(front.z == 1)//假设在上层,就传到下层
dz = 0;
else if(front.z == 0)//假设在下层,就传到上层
dz = 1;
}
vis[dz][dx][dy] = 1;
if(map[dz][dx][dy] == 'P')//找到公主
{
printf("YES\n");
return;
}
rear.x = dx,rear.y = dy;
rear.z = dz,rear.Time=front.Time+1;
q.push(rear);
}
}
}
printf("NO\n");
}
int main()
{
int c;
int i, j, k;
while(~scanf("%d",&c))
{
while(c--)
{
// while(!q.empty())
// q.pop();
// scanf("%d%d%d",&n,&m,&ttime);
cin >> n >> m >> ttime;
for(k = 0; k < 2; k++)
{
for(i = 0; i < n; i++)
{
// scanf("%s",map[k][i]);
for(j = 0; j < m; j++)
{
cin>>map[k][i][j];
if(map[k][i][j] == 'S')
{
x = i, y = j, z = k;
}
}
}
} for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(map[0][i][j]=='#' && map[1][i][j]=='*')
{//假设传送机上方是墙,他就会撞死。。。。
//所以这样的情况也要排除。
map[0][i][j] = '*';
}
if(map[0][i][j]=='*' && map[1][i][j]=='#')
{//假设传送机下方是墙,相同他会撞死,也排除
map[1][i][j] = '*';
}
if(map[0][i][j]=='#' && map[1][i][j]=='#')
{//假设传送机上方还是传送机,就会陷入死循环,
//所以这样的情况我们把上下相应的两个位置设为墙.
map[0][i][j] = '*',map[1][i][j] = '*';
}
}
}
bfs();
}
}
return 0;
}
hdu 2102 A计划(双层BFS)(具体解释)的更多相关文章
- hdu - 2102 A计划 (简单bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...
- 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)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...
随机推荐
- mysql_config_editor程序的用法
1.mysql_config_editor程序的作用: 它只是用来在用户的家目录下生成一个.mylogin.cnf 里面保存有用于登录mysql-server端的password,host,user信 ...
- rabbitmq问题之HTTP access denied: user 'guest' - User can only log in via localhost
问题: 昨天安装rabbitmq(3.3.4版本)服务,并启用rabbitmq_management插件去管理rabbitmq服务,但是在访问管理界面使用guest用户登录时出现login faile ...
- 算法分析-leedcode正则题目
Implement regular expression matching with support for '.' and '*'. 首先这里有个可能大家不知道的地方: if p[0] = '*', ...
- linux的NetworkManager服务
在开启NetworkManager服务的情况下,在终端下敲“service network restart”命令: 正在关闭接口 eth0: 设备状态:3 (断开连接) [确定] 正在关闭接口 eth ...
- xml 解析 Xstream
1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...
- 论山寨手机与Android联姻 【9】SmartPhone的硬件结构
如何区别智能手机(SmartPhone)与功能手机(FeaturePhone)? 有一种观点认为,智能手机本质上是功能手机与便携式电脑(Laptop PC)的结合.功能手机的功能受限于制造厂商的预制, ...
- mongodb use db show dbs
mongodb 常用命令: 在dbs间切换用 use xxxdb 之后再操作就是只针对 xxxdb了: show dbs显示全部数据库 show collections 显示全部集合 mongodb数 ...
- BZOJ 1024 SCOI 2009 生日快乐 深搜
题目大意:有一块蛋糕,长为X,宽为Y.如今有n个人来分这块蛋糕,还要保证每一个人分的蛋糕的面积相等.求一种分法,使得全部的蛋糕的长边与短边的比值的最大值最小. 思路:刚拿到这个题并没有什么思路.可是定 ...
- asp.net 连接sqlserver数据库
在asp.net中连接sqlserver数据库之前,首先得确保正常安装了sqlserver2008,同时有数据库. 在项目中添加一个类DB,用来专门负责执行对数据库的增删改查.在添加的过程中会弹出下面 ...
- mvc中HttpPost理解
public ActionResult Delete(int id) { Book book = db.Book.Find(id); if (book == null) { //重定向到行动(跳转到i ...