算法学习之BFS、DFS入门

0x1 问题描述

迷宫的最短路径

给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。如果不能到达,输出“不能走到那里”。(N,M<=50,起点,终点分别用S,G表示)

输入样例:N=5,M=5
#S###
..##.
#.###
..###
..G## 1
2
3
4
5
6 输出:5

0x2 BFS解法

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

#include <iostream>
#include <string.h>
#include <cstdio>
#include <queue>
#define maxsize 1000+7
using namespace std; char maze[maxsize][maxsize];
int book[maxsize][maxsize];
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
int sx,sy,ex,ey; typedef struct node
{
int x,y,step;
}Node; void bfs()
{
queue <Node> q;
Node p;
p.x=sx;
p.y=sy;
p.step=0;
q.push(p);
book[sx][sy]=1;
while(!q.empty())
{
Node tmp=q.front();
q.pop();
if(tmp.x==ex&&tmp.y==ey)
{
cout<<tmp.step<<endl;
return;
}
for(int i=0;i<4;i++)
{
int nx=tmp.x+next[i][0];
int ny=tmp.y+next[i][1];
if(nx>=1&&ny>=1&&maze[nx][ny]!='#'&&!book[nx][ny])
{
book[nx][ny]=1;
Node tp;
tp.x=nx;
tp.y=ny;
tp.step=tmp.step+1;
q.push(tp);
}
}
}
cout<< -1 <<endl;
} int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>maze[i][j];
if(maze[i][j]=='S')
{
sx=i;
sy=j;
}
if(maze[i][j]=='G')
{
ex=i;
ey=j;
}
}
bfs();
}
return 0;
}

0x3 DFS解法

#include <iostream>
#include <string.h>
#include <cstdio>
#define maxsize 1000+7
using namespace std; char mapplot[maxsize][maxsize];
int book[maxsize][maxsize];
int minstep=0x3f3f3f3f;
int sx,sy,ex,ey;
int n,m;
int dxy[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; void dfs(int x,int y, int step)
{
//cout<<x<<"-"<<y<<endl;
if(x<1||y<1||x>n||y>m)
return;
if(x==ex && y==ey)
{
if(step<minstep)
minstep=step;
return;
}
for(int i=0;i<4;i++)
{
int nx = x+dxy[i][0];
int ny = y+dxy[i][1];
//cout<<nx<<"-"<<ny<<endl;
if(mapplot[nx][ny]!='#' && book[nx][ny]==0)
{
book[nx][ny]=1;
dfs(nx,ny,step+1);
book[nx][ny]=0;
}
}
return;
}
int main()
{
memset(book,0,sizeof(book));
while(scanf("%d %d",&n, &m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>mapplot[i][j];
if(mapplot[i][j]=='S')
{
sx=i;
sy=j;
}
if(mapplot[i][j]=='G')
{
ex=i;
ey=j;
}
}
//cout<< "sx:"<<sx<<"sy:"<<sy<<endl;
//cout<< "sx:"<<ex<<"sy:"<<ey<<endl;
dfs(sx,sy,0);
if(minstep!=0)
cout<< minstep <<endl;
else
cout<< -1 <<endl;
}
return 0;
}

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. python3第一天,随便写写

    哈哈 我滴第一篇博客,不知道咋写,随意看了看别人的博客,我还是不知道咋写,既然是我的博客,那我就把它当随笔写了(这里就是添加随笔...) 也不知道自己说了啥,不过想到了一句话:日记都是写给别人看的.哈 ...

  2. Mysql查询的一些操作(查表名,查字段名,查当月,查一周,查当天)

    查询数据库中所有表名 select table_name from information_schema.tables where table_schema='tools' and table_typ ...

  3. java配置环境及安装

    1.安装JDK开发环境 首先登陆https://www.oracle.com 第一步:Products ---- Java ---- Download java(JDK) for Developers ...

  4. springboot结合maven打包发布

    本篇分享如何使用maven便利我们打springboot的发布包:我这里使用的是idea开发工具,首先创建了多个module的项目结构,如图: 要对多个module的项目做打包,一般情况都是在父级po ...

  5. Python基础(数字,字符串方法)

    数字: #二进制转十进制 a=' v=int(a,base=2) print(v) 进制转换 #当前数字的二进制至少有多少位 b=2 v2=b.bit_length() print(v2) 数值二进制 ...

  6. springboot~maven制作底层公用库

    把一些公用方法,类型抽象到一个项目里,让其它项目依赖它,这种设计是一种解耦的体现,其实像springboot就是我们的一种依赖,他里面有很多子模块,用到哪个就添加哪个依赖即可,像redis,mongo ...

  7. 4.4管道和中间件介绍「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 管道流 我们知道一个管道可以有一个或多个中间件,而中间件的职责是根据HttpContext处理HTTP请求,然后往 ...

  8. 玩转Spring Cloud之API网关(zuul)

    最近因为工作原因,一直没有空写文章,所以都是边忙项目,边利用空闲时间,周末时间学习总结,最终在下班回家后加班加点写完本篇文章,若有不足之处,还请谅解,谢谢! 本文内容导航: 一.网关的作用 二.网关与 ...

  9. [转]Uipath、BluePrism、AA产品对比之设计器篇

    本文转自:https://www.jianshu.com/p/53d0d33a1a35 版本说明: Uipath V2018.3.2,BluePrism V6.3,Automation Anywher ...

  10. Web部分

    说出Servlet的生命周期,并说出Servlet和GCI的区别. Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init方法进行Servlet的初始化,请求到达时 ...