Sample Input

4 2
.###
#...
.#..
#.#.
3 1
.#.
.#.
.#.

Sample Output

4
-1

题意:给一个n*n的图,每次最多能跳k个格子,只能向南(下)或东(右)跳,不能落在‘#’上,求从右上角到左下角的最短时间。

题解:看到图、最短时间第一个反应就是BFS,可惜超时,候来优化了几次,勉强卡时间过了,别人貌似有DP过的,以后抽时间补上这种方法。

先说BFS吧,假设点为(i,j)那么标记的时候会把(i+1,j),(i+2,j)...(i+k,j),(i,j+1),(i,j+2)...(i,j+k)标记,而接下来会走如果(i+1,j),则会标记(i+2,j),(i+3,j)...(i+k+1,j),这样会有重复标记,导致时间复杂度上升。

通过观察不难发现,每次新标记的都是后面几个,所以我们可以倒着标记,当发现这个点被标记时就结束就好。

不过这样需要考虑方向问题,即是横向走的时候被标记了,还是纵向走的时候被标记了,具体看代码。

//如果标记过就结束循环
1111
1000
1111
1111
//就会出现类似这样的情况,原因是第三行横向标记过,导致二三四列在标记的时候碰到第三行就停止了。
//只是举个例子,这不是代码实际标记情况。

附上代码

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue> using namespace std;
const int maxn = 2050; struct node
{
int x,y,step;
}; int f[maxn][maxn],n,k;
char s[maxn][maxn]; void BFS()
{
int i,MIN,dx,dy,m;
queue<node> q;
node t1,t2;
memset(f,0,sizeof(f));
//关于标记,1 代表从上方跳过来,2 代表从左边跳过来,3代表上方,左边都到过这个点。
f[0][0] = 3;
t1.x = t1.y = t1.step = 0;
q.push(t1);
MIN = -1;
while(!q.empty())
{
t1 = q.front();
q.pop();
if(t1.x==n-1&&t1.y==n-1)//结束标志
{
MIN = t1.step;
break;
}
//纵向标记。
if(t1.x+k>=n)//如果最长距离跳出了边界,那么把距离控制在边界内。
m = n - t1.x - 1;
else
m = k;
for(i=m;i>=1;i--)
{
dx = t1.x + i;
dy = t1.y;
if(f[dx][dy]==1||f[dx][dy]==3)
break;
if(s[dx][dy]!='#')
{
if(!f[dx][dy])
f[dx][dy] = 1;
else
f[dx][dy] = 3;
t2.x = dx;
t2.y = dy;
t2.step = t1.step + 1;
q.push(t2);
}
}
//横向标记
if(t1.y+k>=n)
m = n - t1.y - 1;
else
m = k;
for(i=m;i>=1;i--)
{
dx = t1.x;
dy = t1.y + i;
if(f[dx][dy]==2||f[dx][dy]==3)
break;
if(s[dx][dy]!='#')
{
if(!f[dx][dy])
f[dx][dy] = 2;
else
f[dx][dy] = 3;
t2.x = dx;
t2.y = dy;
t2.step = t1.step + 1;
q.push(t2);
}
}
}
printf("%d\n",MIN);
} int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
scanf("%s",s[i]);
BFS();
return 0;
}

Gym - 101617D_Jumping Haybales(BFS)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. TZ_16_Vue父子组件之间的通信

    1.父向子传递props,该如何传递 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  2. [转]Event loop——浏览器和Node区别

    最近对Event loop比较感兴趣,所以了解了一下.但是发现整个Event loop尽管有很多篇文章,但是没有一篇可以看完就对它所有内容都了解的文章.大部分的文章都只阐述了浏览器或者Node二者之一 ...

  3. 20190719-FirstZero

    这也许也是一个成就吧? First Zero 考试 第一次 爆0 好了好了. T1 你永远不知道你在想什么. 我仿佛想出一个$\Theta(NM\log^2 N)$的$dfs$??? 蒟蒻原地爆炸 T ...

  4. Iterm2 快捷键介绍

    Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iterm2 摆在那,基本上也就没有多少出场机会了 I ...

  5. 淘宝镜像(CNPM)安装

    淘宝镜像安装:开始-运行-填写cmd,回车键确定- 输入"npm install -g cnpm --registry=https://registry.npm.taobao.org&quo ...

  6. idea使用docker插件

    idea使用docker插件 接着上一篇docker开启远程访问后,我们就可以通过idea使用docker插件把项目部署到docker了. 首先我们先在idea安装docker插件: 在setting ...

  7. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  8. js点击复制文本

    // 动态创建 input 元素 var aux = document.createElement("input"); // 获得需要复制的内容 aux.setAttribute( ...

  9. HR招聘_(四)_招聘方法论(简历筛选)

    .主动投递 筛选时需要看学历背景,公司平台,所在时间,岗位职责,项目经验几个部分,根据对岗位需求和企业文化选择合适的候选人. 筛选简历建议分岗位筛选,切记误操作或大意淘汰优秀候选人. .搜索下载 互联 ...

  10. Codeforces 451D

    题目链接 D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes inpu ...