算法学习之BFS、DFS入门

0x1 问题描述

  1. 迷宫的最短路径
  2. 给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。如果不能到达,输出“不能走到那里”。(N,M<=50,起点,终点分别用S,G表示)
  3. 输入样例:N=5,M=5
  4. #S###
  5. ..##.
  6. #.###
  7. ..###
  8. ..G##
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5
  14. 6
  15. 输出:5

0x2 BFS解法

​ bfs用来求解最短路径相当简单。

  1. #include <iostream>
  2. #include <string.h>
  3. #include <cstdio>
  4. #include <queue>
  5. #define maxsize 1000+7
  6. using namespace std;
  7. char maze[maxsize][maxsize];
  8. int book[maxsize][maxsize];
  9. int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
  10. int n,m;
  11. int sx,sy,ex,ey;
  12. typedef struct node
  13. {
  14. int x,y,step;
  15. }Node;
  16. void bfs()
  17. {
  18. queue <Node> q;
  19. Node p;
  20. p.x=sx;
  21. p.y=sy;
  22. p.step=0;
  23. q.push(p);
  24. book[sx][sy]=1;
  25. while(!q.empty())
  26. {
  27. Node tmp=q.front();
  28. q.pop();
  29. if(tmp.x==ex&&tmp.y==ey)
  30. {
  31. cout<<tmp.step<<endl;
  32. return;
  33. }
  34. for(int i=0;i<4;i++)
  35. {
  36. int nx=tmp.x+next[i][0];
  37. int ny=tmp.y+next[i][1];
  38. if(nx>=1&&ny>=1&&maze[nx][ny]!='#'&&!book[nx][ny])
  39. {
  40. book[nx][ny]=1;
  41. Node tp;
  42. tp.x=nx;
  43. tp.y=ny;
  44. tp.step=tmp.step+1;
  45. q.push(tp);
  46. }
  47. }
  48. }
  49. cout<< -1 <<endl;
  50. }
  51. int main()
  52. {
  53. while(scanf("%d %d",&n,&m)!=EOF)
  54. {
  55. memset(book,0,sizeof(book));
  56. for(int i=1;i<=n;i++)
  57. for(int j=1;j<=m;j++)
  58. {
  59. cin>>maze[i][j];
  60. if(maze[i][j]=='S')
  61. {
  62. sx=i;
  63. sy=j;
  64. }
  65. if(maze[i][j]=='G')
  66. {
  67. ex=i;
  68. ey=j;
  69. }
  70. }
  71. bfs();
  72. }
  73. return 0;
  74. }

0x3 DFS解法

  1. #include <iostream>
  2. #include <string.h>
  3. #include <cstdio>
  4. #define maxsize 1000+7
  5. using namespace std;
  6. char mapplot[maxsize][maxsize];
  7. int book[maxsize][maxsize];
  8. int minstep=0x3f3f3f3f;
  9. int sx,sy,ex,ey;
  10. int n,m;
  11. int dxy[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
  12. void dfs(int x,int y, int step)
  13. {
  14. //cout<<x<<"-"<<y<<endl;
  15. if(x<1||y<1||x>n||y>m)
  16. return;
  17. if(x==ex && y==ey)
  18. {
  19. if(step<minstep)
  20. minstep=step;
  21. return;
  22. }
  23. for(int i=0;i<4;i++)
  24. {
  25. int nx = x+dxy[i][0];
  26. int ny = y+dxy[i][1];
  27. //cout<<nx<<"-"<<ny<<endl;
  28. if(mapplot[nx][ny]!='#' && book[nx][ny]==0)
  29. {
  30. book[nx][ny]=1;
  31. dfs(nx,ny,step+1);
  32. book[nx][ny]=0;
  33. }
  34. }
  35. return;
  36. }
  37. int main()
  38. {
  39. memset(book,0,sizeof(book));
  40. while(scanf("%d %d",&n, &m)!=EOF)
  41. {
  42. for(int i=1;i<=n;i++)
  43. for(int j=1;j<=m;j++)
  44. {
  45. cin>>mapplot[i][j];
  46. if(mapplot[i][j]=='S')
  47. {
  48. sx=i;
  49. sy=j;
  50. }
  51. if(mapplot[i][j]=='G')
  52. {
  53. ex=i;
  54. ey=j;
  55. }
  56. }
  57. //cout<< "sx:"<<sx<<"sy:"<<sy<<endl;
  58. //cout<< "sx:"<<ex<<"sy:"<<ey<<endl;
  59. dfs(sx,sy,0);
  60. if(minstep!=0)
  61. cout<< minstep <<endl;
  62. else
  63. cout<< -1 <<endl;
  64. }
  65. return 0;
  66. }

0x4 总结

​ 关于写这个模版的时候,我不是很注意标记,还有一些细节的地方,比如!='#' 因为dfs的进去的时候nx,ny为'G'

如果写的是=='.'就永远找不到目标点。

算法学习之BFS、DFS入门的更多相关文章

  1. 算法学习记录-图(DFS BFS)

    图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...

  2. 算法基础:BFS和DFS的直观解释

    算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...

  3. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

  4. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  5. 超全PHP学习资源整理:入门到进阶系列

    PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...

  6. Kosaraju算法学习

    Kosaraju 算法学习 序 这星期捣鼓了一个新的算法--Kosaraju算法 今天分享给大家 简介 Kosaraju算法,其实与tarjan算法差不多.但是码量较小,容易记忆.其时间复杂度与tar ...

  7. <2014 05 09> Lucida:我的算法学习之路

    [转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...

  8. 最大流EK算法/DINIC算法学习

    之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...

  9. 数据结构和算法(Golang实现)(1)简单入门Golang-前言

    数据结构和算法在计算机科学里,有非常重要的地位.此系列文章尝试使用 Golang 编程语言来实现各种数据结构和算法,并且适当进行算法分析. 我们会先简单学习一下Golang,然后进入计算机程序世界的第 ...

随机推荐

  1. 记录SoapUI使用说明

    一.SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到E ...

  2. Ambari 常用的 REST API 介绍

    源码文档路径:ambari\ambari-server\docs\api\v1 swagger风格api文档:https://www.cnblogs.com/felixzh/p/10694724.ht ...

  3. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  4. MySQL学习(二)索引与锁 --- 2019年1月

    1.Order By 是怎么工作的 MySQL做排序是一个成本比较高的操作.MySQL会为每个线程分配一个 sort_buffer 内存用于排序,该内存大小为 sort_buffer_size. 全字 ...

  5. C# 实现WebSocket通信

    本实例可通过web网页端进行测试,下面直接上代码. 首先要在NuGet导入“Fleck”包,需 .NET Framework 4.5及以上. using System; using System.Co ...

  6. 我眼中的 Nginx(一):Nginx 和位运算

    作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...

  7. 聊聊在AOP模式下的缓存方案

    面向方法的数据集缓存 使用了autofac做为ioc容器,使用Autofac.Extras.DynamicProxy2作为方法拦截器,缓存面向方法,直接在方法上添加CachingAttribute特性 ...

  8. 用命令行撤销工作区的所有更改(修改文件&&新增文件)

    话说起来之前放弃工作区所有的更改,我一直都是直接用VSCode在workingTree的按钮,如下:   直到有一天我感觉这样不够酷,于是我试了git reset --hard. 然并卵,这个命令虽然 ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  10. SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...