算法学习之BFS、DFS入门
算法学习之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入门的更多相关文章
- 算法学习记录-图(DFS BFS)
图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...
- 算法基础:BFS和DFS的直观解释
算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...
- LeetCode:BFS/DFS
BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...
- Hadoop学习笔记(1) ——菜鸟入门
Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...
- 超全PHP学习资源整理:入门到进阶系列
PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...
- Kosaraju算法学习
Kosaraju 算法学习 序 这星期捣鼓了一个新的算法--Kosaraju算法 今天分享给大家 简介 Kosaraju算法,其实与tarjan算法差不多.但是码量较小,容易记忆.其时间复杂度与tar ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- 最大流EK算法/DINIC算法学习
之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...
- 数据结构和算法(Golang实现)(1)简单入门Golang-前言
数据结构和算法在计算机科学里,有非常重要的地位.此系列文章尝试使用 Golang 编程语言来实现各种数据结构和算法,并且适当进行算法分析. 我们会先简单学习一下Golang,然后进入计算机程序世界的第 ...
随机推荐
- 远程连接身份验证错误,又找不到加密Oracle修正
远程连接服务器出现了错误,错误信息为:远程连接身份验证错误,又找不到加密Oracle修正. 服务器系统:Windows Server2016 客户端系统:Windows10家庭版和专业版 出错原因 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- Linux新手随手笔记1.8
配置网卡服务 将网卡的配置文件,保存成模板,叫做会话. nmcli命令查看网卡信息.nmcli是一款基于命令行的网络配置工具 只有一个网卡信息,下面我们再添加一个. 公司:静态IP地址 家庭:DHCP ...
- MySQL命令窗口下中文显示乱码的解决过程
在dos客户端输出窗口中查询表中的数据,还有项目部署到服务器上时前台的页面,中文数据都显示成乱码,如下图所示: 这个问题困扰了我一天,后来解决了才发现原来我的方向错了,一直我以为是SpringBoot ...
- java游戏开发杂谈 - java是什么
java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了) j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...
- Python:bs4中 string 属性和 text 属性的区别及背后的原理
刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...
- 从PRISM开始学WPF(三)Prism-Region-更新至Prism7.1
[7.1update]在开始前,我们先看下版本7.1中在本实例中的改动. 首先,项目文件中没有了Bootstrapper.cs,在上一篇的末尾,我们说过了,在7.1中,不见推荐使用Bootstrapp ...
- DSAPI官方QQ群
DSAPI官方QQ群 请加主群,若主群成员已满,请加分群. 群内除常规的.NET技术交流外,也负责DSAPI的使用技术支持和更新通知. 『VB.NET/C#编程』主群 ...
- mysql 设置自增主键id的起始值
修改user表,主键自增从20000开始 alter table user AUTO_INCREMENT=20000;
- Webpack4教程 - 第二部分,使用loader处理scss,图片以及转换JS
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://wanago.io/2018/07/16/webpack-4-course-par ...