hdu 2364 Escape【模拟优先队列】【bfs】
题目链接:https://vjudge.net/contest/184966#problem/A
题目大意:
走迷宫。从某个方向进入某点,优先走左或是右。如果左右都走不通,再考虑向前。绝对不能往后走,即使没走过。
解题思路:
重点是定义vis数组,每个点的四个方向都走过,这个点才算vis完了。……不过我还是没想明白,为什么能够想到要这样定义vis数组,应该题目做多了就知道了吧。
其它要注意的点就是如何实现优先左右转弯的功能。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 85
int map[N][N], mmin, flag, n, m, vis[N][N][];
char str[N][N];
typedef struct node {
int x, y;
int father;//记录方向
int step;//记录步数
}node; int bfs(int x, int y)
{
int k[][] = { ,,-,,,-,, };
int nx, ny, xi, yi, x1, y1, x2, y2;
node nextq, nowq;
memset(vis, , sizeof(vis));//初始化标记数组
queue<node>Q;
flag = ;//标记是否能够成功到达
nowq.father = -;//起点的方向是-1,区别其它点
nowq.x = x;
nowq.y = y;
nowq.step = ;//初始化起点
vis[x][y][] = , vis[x][y][] = ;//起点标记为已经走过
vis[x][y][] = , vis[x][y][] = ;
Q.push(nowq);//将起点加入队列
while (!Q.empty())
{
nowq = Q.front();
Q.pop();
if (nowq.x == || nowq.y == || nowq.x == n - || nowq.y == m - )//到达出口,因为map的边界上只有一个为'.',且该点为出口
{
if (str[nowq.x][nowq.y] != '#')
flag = ;//能够成功到达
return nowq.step;
}
for (int i = ; i < ; i++)
{
nx = nowq.x + k[i][];
ny = nowq.y + k[i][];
if (nx < || ny < || nx > n - || ny > m - || str[nx][ny] == '#' || vis[nx][ny][i])
continue; //不能越界,不能是墙,不能已经是访问过的点
nextq.x = nx;
nextq.y = ny;
nextq.father = i;//记录父点到当前点的方向
nextq.step = nowq.step + ;//步数加1
if (nowq.father % == i % )
{
if (nowq.father == i)
{
x1 = nowq.x + k[(i + ) % ][];
y1 = nowq.y + k[(i + ) % ][];
x2 = nowq.x + k[(i - + ) % ][];
y2 = nowq.y + k[(i - + ) % ][];
if (str[x1][y1] != '.'&&str[x2][y2] != '.')//如果当前位置左右两边都不能走即只能直走
{
vis[nx][ny][i] = ;//标记该方向为已经访问过
Q.push(nextq);
}
}
}
else
{
vis[nx][ny][i] = ;
Q.push(nextq);
}
}
}
return -;
}
int main()
{
int t, i, j, x, y;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
memset(str, , sizeof(str));
for (i = ; i < n; i++)
{
scanf("%s", str[i]);
for (j = ; j < m; j++)
{
if (str[i][j] == '@')//找到起点,存入x,y.
{
x = i;
y = j;
}
}
}
mmin = bfs(x, y);//返回步数
if (flag)//如果能到达出口。输出步数
printf("%d\n", mmin);
else
printf("-1\n"); //否则输出-1 }
return ;
}
2018-03-25
hdu 2364 Escape【模拟优先队列】【bfs】的更多相关文章
- hdu - 1242 Rescue && hdu - 2425 Hiking Trip (优先队列+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了 ...
- Hdu 2364 Escape
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2364 这道题的特殊之处在于能转弯时不能直走,必须转弯,所以在行走时,要判断能否转弯,不能转弯 ...
- hdu 1026 Ignatius and the Princess I【优先队列+BFS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 3533 Escape(大逃亡)
HDU 3533 Escape(大逃亡) /K (Java/Others) Problem Description - 题目描述 The students of the HEU are maneu ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- HDU 2717 Catch That Cow --- BFS
HDU 2717 题目大意:在x坐标上,农夫在n,牛在k.农夫每次可以移动到n-1, n+1, n*2的点.求最少到达k的步数. 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先 ...
- ZOJ 649 Rescue(优先队列+bfs)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 【POJ3635】Full Tank 优先队列BFS
普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解. 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解. 且对于优先队列BFS来说, ...
- Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]
题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...
随机推荐
- 找到 Confluence 6 的日志和配置文件
找到 Confluence 的日志文件 这部分内容对 Confluence 的默认日志表现进行描述并且假设你没有对 Confluence 的默认日志配置进行修改.为了统一在不同平台中的日志输出,Con ...
- java-HTML&javaSkcript&CSS&jQuery&ajax( 八)
一.JavaScript教程笔记 1.在web页面中一般使用JavaScript脚本语言,支持跨平台,跨浏览器,驱动网页,与用户交互.另外Node.js把JavaScript引入到了服务器端. Jav ...
- 小学生都看得懂的C语言入门(1): 基础/判别/循环
c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++ ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...
- tensorflow(3):神经网络优化(ema,regularization)
1.指数滑动平均 (ema) 描述滑动平均: with tf.control_dependencies([train_step,ema_op]) 将计算滑动平均与 训练过程绑在一起运行 train_o ...
- 20165314 2016-2017-2 《Java程序设计》第8周学习总结
20165314 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 java中的线程 线程的常用方法 GUI线程 多线程的概念 代码托管
- vue 的router的简易运用
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java 输入一组数字,用穷举的方法列出
import java.util.Scanner; public class TestScanner { public static void main(String[] args) { Scanne ...
- Java链表和递归
删除链表的指定元素: public class ListNode { public int val; public ListNode next; public ListNode(int x){ val ...
- Senparc.Weixin微信开发(2) 消息机制和上下文(Session)
了解MessageHandler 为项目添加一个CustomMessageHandle.cs类 public class CustomMessageHandler : MessageHandler&l ...
- [转] webpack之前端性能优化(史上最全,不断更新中。。。)
最近在用webpack优化首屏加载性能,通过几种插件之后我们上线前后的速度快了一倍,在此就简单的分享下吧,先上个优化前后首屏渲染的对比图. 可以看到总下载时间从3800ms缩短到1600ms. 我们在 ...