题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1728

思路

BFS

一开始 从开始位置 往四周走 如果能走的话 这个时候 转弯次数都是0

我们的标记不是简单的标记

我们给每个已经访问过的位置 第一次访问时 我们将此时的转弯次数 赋值给它

当下一次 有其他状态 又来访问的时候,我们判断一下 之前已经标记的转弯次数 是比当前的大于等于吗 如果是 那么这个点 就可以继续走下去 如果不是 目前的这个状态就可以不要 相当于剪枝了

有几个坑点

输入的时候 坐标是从1-N 1-M 的

然后输入起始坐标的时候,, x 代表列 y 代表行

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<list>
#include<stack>
#include <queue> #define CLR(a, b) memset(a, (b), sizeof(a)) using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e2 + 5; int Move[4][2] = // up 0 down 1 left 2 right 3
{
-1, 0, // up
1, 0, // down
0,-1, // left
0, 1, // right
}; int n, m; int G[maxn][maxn];
int v[maxn][maxn]; int sx, sy, ex, ey, limit; int ans; struct node
{
int x, y;
int step;
int dis;
}; bool ok(int x, int y, int step)
{
if (x < 0 || x >= n || y < 0 || y >= m || G[x][y] == 0 || v[x][y] < step)
return false;
return true;
} void bfs()
{
queue <node> q;
node tmp;
tmp.step = 0;
v[sx][sy] = 1;
for (int i = 0; i < 4; i++)
{
tmp.x = sx + Move[i][0];
tmp.y = sy + Move[i][1];
tmp.dis = i;
if (ok(tmp.x, tmp.y, tmp.step))
{
q.push(tmp);
v[tmp.x][tmp.y] = tmp.step;
}
}
while (!q.empty())
{
node u = q.front(), V;
q.pop();
if (u.x == ex && u.y == ey)
{
if (u.step <= limit)
{
ans = 1;
return;
}
}
if (u.step > limit)
continue;
for (int i = 0; i < 4; i++)
{
V.x = u.x + Move[i][0];
V.y = u.y + Move[i][1];
if (u.dis != i)
V.step = u.step + 1;
else
V.step = u.step;
V.dis = i;
if (ok(V.x, V.y, V.step))
{
q.push(V);
v[V.x][V.y] = V.step;
}
}
} } void init()
{
CLR(G, 0);
CLR(v, 0x3f);
} int main()
{
int t;
cin >> t;
while (t--)
{
init();
scanf("%d%d", &n, &m);
char c;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf(" %c", &c);
if (c == '.')
G[i][j] = 1;
else
G[i][j] = 0;
}
}
scanf("%d%d%d%d%d", &limit, &sy, &sx, &ey, &ex);
sx--, sy--, ex--, ey--;
ans = 0;
bfs();
if (ans)
printf("yes\n");
else
printf("no\n");
} }

HDU - 1728 逃离迷宫 【BFS】的更多相关文章

  1. hdu 1728 逃离迷宫 bfs记转向

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  2. hdu 1728 逃离迷宫 bfs记步数

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  3. hdu 1728 逃离迷宫 (BFS)

    逃离迷宫 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  4. hdu 1728 逃离迷宫 BFS加优先队列 DFS()

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意就是能否在规定的转弯次数内从起点走到终点.刚走时那步方向不算. 只会bfs(),但想到这题需要记录转弯 ...

  5. HDU 1728 逃离迷宫 BFS题

    题目描述:输入一个m*n的地图,地图上有两种点,一种是 . 表示这个点是空地,是可以走的,另一种是 * ,表示是墙,是不能走的,然后输入一个起点和一个终点,另外有一个k输入,现在要你确定能否在转k次弯 ...

  6. HDU 1728 逃离迷宫(DFS||BFS)

    逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...

  7. HDU 1728 逃离迷宫(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)  ...

  8. HDU 1728 逃离迷宫

    [题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...

  9. HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. hdu 1728:逃离迷宫(DFS,剪枝)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. ios 不通过import 调用其他控制器的方法

    ios 开发过程中在不通过import 调用其他类的方法 //获取类名 Class controller = NSClassFromString(@"controller"); / ...

  2. Selenium3.14.1+Python安装和第一个Demo

    言简意赅的说下Selenium是什么 Selenium是前台测试框架,支持IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome等浏览器,我只 ...

  3. android ListView滚动条监听判断滚动到底部还是顶部

    代码: lv.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView vie ...

  4. RAII手法封装相互排斥锁

    CriticalSectionWrapper是一个接口类 class CriticalSectionWrapper { public: // Factory method, constructor d ...

  5. 基于多输出有序回归的年龄识别(CVPR_2016)

    作为学习记录,将所做PPT摘录如下: 网络结构: 网络结构描述: 网络工作流程: 损失函数计算: 亚洲人脸数据集: 参考代码:

  6. web开发方法

    request.getContextPath()是在开发Web项目时,经常用到的方法,其作用是获取当前的系统路径.

  7. 为什么jdbc中的resultset只能取一次去第二次就报错了

    引用 6 楼  的回复: 好吧各位,应该写getInt(1)但是我要问的是为什么第二次用会出错 啊,好古老的一个问题... 第二次出错的原因,是因为你创建Statement的时候,没有指定结果集(游标 ...

  8. 史上最全的CSS hack方式一览(转)

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  9. mysql解压版安装和卸载

    问题1:发生系统错误 5. 解决:使用管理员身份安装即可 问题2:发生系统错误 2. 解决:cd C:\Program Files\MySQL\MySQL Server 5.6\bin 进入mysql ...

  10. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...