HDOJ 2102 A计划(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102
思路分析:
<1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索
<2>需要注意的地方:
1)如果当前状态为'#'字符,需要传送到另外一层,但是从该层到另外一层的时间是不会计算;
2)如果当前状态为'#'字符,则应该考虑该状态能否拓展;因为另一层的相同位置的字符可能为
'S','P','.','*'或者'#',所以对于另一层相同位置的字符可能的各种情况应该考虑到并处理;
只有当字符为’P’或者’.’时才能被传送,其他字符不能传送,即该状态不能拓展,需要被剪枝;
PS:由于没有考虑到另一层的各种情况,导致WA多次,希望引以为鉴。
代码如下:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std; const int MAX_N = + ;
char maze[][MAX_N][MAX_N];
bool visited[][MAX_N][MAX_N];
int N, M, T;
int move_[][] = {{-, }, {, }, {, -}, {, }}; struct Node
{
int x, y, z;
int time;
Node() { x = y = z = time = ; }
Node(int i, int j, int k, int t) { x = i; y = j; z = k; time = t; }
}; int Bfs()
{
Node start;
queue<Node> state; state.push(start);
visited[][][] = true;
while (!state.empty())
{
int x, y, z, t;
Node temp_state; temp_state = state.front();
state.pop();
x = temp_state.x;
y = temp_state.y;
z = temp_state.z;
t = temp_state.time;
for (int i = ; i < ; ++i)
{
char maze_ch = maze[z][x][y];
int next_x = x + move_[i][];
int next_y = y + move_[i][];
int next_z = z;
int next_time = t + ;
char maze_n_ch = maze[next_z][next_x][next_y]; if (next_x < || next_x >= N || next_y < || next_y >= M
|| next_time > T || visited[next_z][next_x][next_y])
continue;
if (maze_n_ch == '#')
next_z = - next_z;
maze_n_ch = maze[next_z][next_x][next_y];
if (maze_n_ch == '*' || maze_ch == '#')
continue;
if (maze_n_ch == 'P')
return next_time;
Node next_state(next_x, next_y, next_z, temp_state.time + );
state.push(next_state);
visited[next_z][next_x][next_y] = true;
}
}
return -;
} int main()
{
int case_times; scanf("%d", &case_times);
while (case_times--)
{
int ans = ; scanf("%d %d %d", &N, &M, &T);
for (int i = ; i < ; ++i)
for (int j = ; j < N; ++j)
scanf("%s", maze[i][j]);
memset(visited, , sizeof(visited));
ans = Bfs();
if (ans == -)
printf("NO\n");
else
printf("YES\n");
}
return ;
}
HDOJ 2102 A计划(bfs)的更多相关文章
- BFS HDOJ 2102 A计划
题目传送门 题意:中文题面 分析:双层BFS,之前写过类似的题.总结坑点: 1.步数小于等于T都是YES 2. 传送门的另一侧还是传送门或者墙都会死 3. 走到传送门也需要一步 #include &l ...
- hdoj 2102 A计划
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2102 A计划(BFS/DFS走迷宫)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 2102 A计划-bfs
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二
思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...
- HDU 2102 A计划 (BFS或DFS)
题意:中文题. 析:是一个简单的搜索,BFS 和 DFS都可行, 主要是这个题有一个坑点,那就是如果有一层是#,另一个层是#或者*,都是过不去的,就可以直接跳过, 剩下的就是一个简单的搜索,只不过是两 ...
- hdoj 2102 A计画 【BFS】
称号:hdoj 2102 A计画点击打开链接 意甲冠军:文的就不说了.求救出公主所须要的最短时间,所以用广搜. 分析:读题之后不难做,比一般的题目多了一个条件就是能够传送,那么我们能够在广搜里面加一个 ...
- 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计划
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...
随机推荐
- P - Shopaholic
P - Shopaholic Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit ...
- centos 安装mysql密码修改后还是不能连接的原因
centos 上安装mysql密码修改后还是不能连接出现错误:ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for ...
- 原生js动态改变dom高度
item参数为要改变高度的dom,maxHight参数为dom的最大高度,speed参数为改变高度的速度function addHeight(item,maxHight,speed){ var ite ...
- poj 1206
/** 题意: 给定一序列,置换k次之后 输出其状态 置换: 考察循环节长度, 思路: 分别求出每个元素的循环节的大小,用k 模其大小,大的k次之后的位置, 输出即可 **/ #include < ...
- 一起来看看css中的单位
一起来看看css中的单位 由于一直以来对于css中的百分比单位究竟是相对于谁的比例,这个问题不是很了解,所以就专门找资料看了一下. <div class="container w500 ...
- 转: when.js原理和核心实现
这篇文章可以看作是屈屈同学关于when.js的文章<异步编程:When.js快速上手>的续篇. 屈屈的文章中详细介绍了when.js,在这里关于when.js的使用我就不多复述了,大家可以 ...
- 调色板类QPalette——包含了Qt窗口不见的颜色组(collor group),和Windows右键属性外观非常类似
QPalette类包含了Qt窗口不见的颜色组(collor group); 1.Active组,该组的颜色用户当前活动的(active)窗口,即具有键盘或鼠标焦点的窗口; 2.Inactive组,该组 ...
- VC++或QT下 高精度 多媒体定时器
在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码 ...
- VS2010/MFC对话框:消息对话框
消息对话框 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中经常用到消息对话框,所以MFC提供了两个函数可以直接生成指定风格的消息对话框,而不 ...
- UIKit封装的系统动画
简介 在UIKit中,对UIView封装了很多类方法来进行简单的动画实现,在动画过程中,通过对属性值的修改来完成一系列的效果. 在IOS4以前,主要通过 + beginAnimation + setA ...