Sample Input

  1. 4 2
  2. .###
  3. #...
  4. .#..
  5. #.#.
  6. 3 1
  7. .#.
  8. .#.
  9. .#.

Sample Output

  1. 4
  2. -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),这样会有重复标记,导致时间复杂度上升。

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

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

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

附上代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <queue>
  7. using namespace std;
  8. const int maxn = 2050;
  9. struct node
  10. {
  11. int x,y,step;
  12. };
  13. int f[maxn][maxn],n,k;
  14. char s[maxn][maxn];
  15. void BFS()
  16. {
  17. int i,MIN,dx,dy,m;
  18. queue<node> q;
  19. node t1,t2;
  20. memset(f,0,sizeof(f));
  21. //关于标记,1 代表从上方跳过来,2 代表从左边跳过来,3代表上方,左边都到过这个点。
  22. f[0][0] = 3;
  23. t1.x = t1.y = t1.step = 0;
  24. q.push(t1);
  25. MIN = -1;
  26. while(!q.empty())
  27. {
  28. t1 = q.front();
  29. q.pop();
  30. if(t1.x==n-1&&t1.y==n-1)//结束标志
  31. {
  32. MIN = t1.step;
  33. break;
  34. }
  35. //纵向标记。
  36. if(t1.x+k>=n)//如果最长距离跳出了边界,那么把距离控制在边界内。
  37. m = n - t1.x - 1;
  38. else
  39. m = k;
  40. for(i=m;i>=1;i--)
  41. {
  42. dx = t1.x + i;
  43. dy = t1.y;
  44. if(f[dx][dy]==1||f[dx][dy]==3)
  45. break;
  46. if(s[dx][dy]!='#')
  47. {
  48. if(!f[dx][dy])
  49. f[dx][dy] = 1;
  50. else
  51. f[dx][dy] = 3;
  52. t2.x = dx;
  53. t2.y = dy;
  54. t2.step = t1.step + 1;
  55. q.push(t2);
  56. }
  57. }
  58. //横向标记
  59. if(t1.y+k>=n)
  60. m = n - t1.y - 1;
  61. else
  62. m = k;
  63. for(i=m;i>=1;i--)
  64. {
  65. dx = t1.x;
  66. dy = t1.y + i;
  67. if(f[dx][dy]==2||f[dx][dy]==3)
  68. break;
  69. if(s[dx][dy]!='#')
  70. {
  71. if(!f[dx][dy])
  72. f[dx][dy] = 2;
  73. else
  74. f[dx][dy] = 3;
  75. t2.x = dx;
  76. t2.y = dy;
  77. t2.step = t1.step + 1;
  78. q.push(t2);
  79. }
  80. }
  81. }
  82. printf("%d\n",MIN);
  83. }
  84. int main()
  85. {
  86. int i;
  87. scanf("%d%d",&n,&k);
  88. for(i=0;i<n;i++)
  89. scanf("%s",s[i]);
  90. BFS();
  91. return 0;
  92. }

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. Python之常用文件操作

    Python之常用文件操作

  2. C# 多线程操作之异步委托

    标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)    目录(?)[+] ...

  3. Mybatis insert返回主键ID

    Mybatis insert语句书写 <insert id="insertSelective" useGeneratedKeys="true" keyPr ...

  4. 关于java中的异常

    java中有时候要写形如下图中的方法抛出异常 之所以要这么写(要在方法声明行写上throws ...)是因为这种 FileNotFoundException 属于编译异常 不属于运行时异常 不会主动抛 ...

  5. JSP-response(HttpServletResponse)

    1 HttpServletResponse概述 2 Response 运行过程 3 通过抓包工具抓取Http响应 4 响应行 5 设置响应头 set  和add的区别 6 重定向 需要完成分析‘ 6 ...

  6. Laravel(PHP)使用Swagger生成API文档不完全指南 - 基本概念和环境搭建 - 简书

    在PHPer中,很多人听说过Swagger,部分人知道Swagger是用来做API文档的,然而只有少数人真正知道怎么正确使用Swagger,因为PHP界和Swagger相关的资料实在是太少了.所以鄙人 ...

  7. Vue--系统指令(基础)

    Vue概念:vue是mvvm模式的,直接操作dom开销较大,先获取dom,修改里边的内容,但是用vue的话,直接视图和模型绑定,不管是视图的数据发生改变还是模型的数据发生改变,其都是关联的,不需要直接 ...

  8. Hibernate:**not found while looking for property: id https://blog.csdn.net/weixin_43827144/article/details/88935334

    https://blog.csdn.net/weixin_43827144/article/details/88935334 在程序执行时可能会报找不到属性的错误:例如:class Student n ...

  9. Linux 7.X 网络配置

    Linux 7.X 网络配置 环境: 笔记本中安装了虚拟机,在虚拟机中安装了Redhat 7.4版本的操作系统,现配置该操作系统网络.(IP.网关等) 相关指令如下: # nmcli connecti ...

  10. 顶级测试框架Jest指南:跑通一个完美的程序,就是教出一群像样的学生

    facebook三大项目:yarn jest metro,有横扫宇宙之势. 而jest项目的宗旨为:减少测试一个项目所花费的时间成本和认知成本. --其实,它在让你当一个好老师. jest文档非常简略 ...