算法学习之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. 个人整理的 Windows 下 .NET 开发必装的软件

    注: 最后更新时间:2019-03-15 一..NET 开发 1. 必装 软件名称 说明 下载地址 JetBrains Toolbox JetBrins 全家桶管理工具. 下载地址 JetBrains ...

  2. 处理安卓和ios当页面原生键盘弹出,输入框不显示

    $('input').on('click', function () { var target = this; // 使用定时器是为了让输入框上滑时更加自然 setTimeout(function() ...

  3. 【js】项目中有关时间的问题

    一.时间戳 简单讲,unix时间戳就是从1970-01-01开始所经过的秒数,什么时候获取时间戳,就是到那个时间点所经历的秒数. 二.JavaScript获取时间戳 根据时间戳的定义,可以使用java ...

  4. #Java学习之路——基础阶段二(第六篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  5. Appium在Android7.0及以上系统运行时报错的解决方案

    背景:在使用Samsung S系列手机进行自动化测试时,发现同样脚本的情况下华为荣耀系列可以正常运行,最终发现差异在于Android7.0及以上系统和appium版本不匹配,需要升级appium.但需 ...

  6. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】

    前言 关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想: 一.Swagger的使用 3.3 JWT权限验证[修改] 二.解决JWT权限验证过期问题 三.JWT完美实现权限与接口的动态分 ...

  7. SpringBoot是怎么在实例化时候将bean加载进入容器中

    之前写过的很多spring文章,都是基于应用方面的,这次的话,就带大家来一次对spring的源码追踪,看一看spring到底是怎么进行的初始化,如何创建的bean,相信很多刚刚接触spring的朋友, ...

  8. 论文学习-系统评估卷积神经网络各项超参数设计的影响-Systematic evaluation of CNN advances on the ImageNet

    博客:blog.shinelee.me | 博客园 | CSDN 写在前面 论文状态:Published in CVIU Volume 161 Issue C, August 2017 论文地址:ht ...

  9. @vue-cli3创建项目报错:ERROR command failed: npm install --loglevel error --registry=https://registry.npm.taobao.org --di

    使用@vue-cli3时 在你感觉所以配置都搞好开始创建项目时,不停的报错,就是创建不成功 清npm缓存也不行 改淘宝镜像也不行 就快奔溃了,最后最终(其实我在凑150字,为了能发到首页给更多采坑的兄 ...

  10. [转]koa 实现 jwt 认证

    本文转自:https://blog.csdn.net/qq673318522/article/details/78641136 关于 Token 认证机制,这里不做更多解释.不清楚的可以看我的这篇文章 ...