深度优先搜索及广度优先搜索
一.深度优先搜索。
1.主要思想:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点走到未被访问顶点,当没有未被访问顶点时,返回上一个顶点,继续访问别的顶点,直到所有的顶点都被访问过。
2:主要通过循环及递归来实现。
A:输出数n的全排列
#include<stdio.h> //以123->132为例
int a[10],book[10],n;//此处设n为3
void dfs(int step)
{
int i;
if(step==n+1)//当step=n+1时,表示以完成一种排列,返回到函数实参的下一条语句
{
for(i=1;i<=n;i++)
{
printf("%d",a[i]);//第一次排列完成123
}
printf("\t");
return;//返回到book[3]=0;
}
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;//book[3]=0;注意此处step已经变为3
}
}
return; //返回到 step=2;则book[2]=0;再完成未完成的循环可得a[step=2]=3;
}
int main(void)
{
scanf("%d",&n);
dfs(1);
return 0;
}
B:寻找最短路径
输入两个坐标A,B,找出A坐标到B坐标的最短路径
#include<stdio.h>
int n,m,p,q,min=99999999;
int a[51][51],book[51][51];//book用来标记走过的路程
void dfs(int x,int y,int step)
{int next[4][2]{{0,1},{1,0},{0,-1},{-1,0},};int tx,ty,i;if(x==p&&y==q){if(min>step)min=step;return;}for(i=0;i<=3;i++){tx=x+next[i][0];ty=y+next[i][1];if(tx<1||tx>n||ty<1||ty>m)//判断是否越界{continue; //当出界时会将循环走完返回原位置,然后返回上一个调用继续往下走。 }if(a[tx][ty]==0&&book[tx][ty]==0){book[tx][ty]=1;dfs(tx,ty,step+1);book[tx][ty]=0;}}return;
}
int main(void)
{int i,j,startx,starty;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=m;j++){scanf("%d",&a[i][j]);}scanf("%d%d%d%d",&startx,&starty,&p,&q);book[startx][starty]=1;dfs(startx,starty,0);printf("%d",min);}
二.广度优先搜索
1.主要思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有的顶点都被访问过。
2:主要通过队列对顶点进行入队,当顶点的所有相邻顶点都被访问过时,该顶点出队。
A:采用深度优先搜索解决最短路径问题
#include<stdio.h>
struct node
{int x;//横坐标 int y;//纵坐标 int s;//步数
};
int main(void)
{struct node que[2501];int a[51][51]={0},book[51][51]={0};int next[4][2]{{0,1},{1,0},{0,-1},{-1,0},};int head,tail;int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&a[i][j]);scanf("%d%d%d%d",&startx,&starty,&p,&q);head=1;tail=1;que[tail].x=startx;que[tail].y=starty;que[tail].s=0;tail++;book[startx][starty]=1;flag=0;//用来标记是否到达目的点while(head<tail){for(k=0;k<=3;k++){tx=que[head].x+next[k][0];ty=que[head].y+next[k][1];if(tx<1||tx>n||ty<1||ty>m){continue;}if(a[tx][ty]==0&&book[tx][ty]==0){book[tx][ty]=1;que[tail].x=tx;que[tail].y=ty;que[tail].s=que[head].s+1;tail++;}if(tx==p&&ty==q){flag=1;break;}} if(flag==1)break;head++;//当所有点都走完后队头再前进 } printf("%d",que[tail-1].s); }
在学习的过程中发现其实无论深度还是广度时间复杂度都是相当的高,(每一个节点都得遍历一遍又能低到哪去?),虽然数据结构才刚刚入门,但是真的可以感觉到算法的魅力
深度优先搜索及广度优先搜索相关推荐
- 八数码深度优先搜索_深度优先搜索和广度优先搜索
深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...
- 算法十——深度优先搜索和广度优先搜索
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 搜索算法 算法是作用于数据结构之上的.深度优先搜索.广度优先搜索是作用于图这种数据结构之上的.图上的搜索 ...
- 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索
什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...
- 深度优先搜索和广度优先搜索
深度优先搜索和广度优先搜索 在人工智能的运筹学的领域中求解与图相关的应用中,这两个算法被证明是非常有用的,而且,如需高效地研究图的基本性质,例如图的连通性以及图是否存在环,这些算法也是必不可少的. ...
- 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)
目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...
- 迷宫问题:深度优先搜索和广度优先搜索
迷宫问题:深度优先搜索和广度优先搜索 1.深度优先搜索可以使用栈实现,栈顶元素为当前节点 2.当前节点搜索下一节点,判断节点是否走得通,如果走得通任意方向走一步,走不通一直弹出栈内元素,直到走得通 3 ...
- 学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
目录 一. 图解二叉树的深度优先搜索 二. 二叉树的广度优先搜索 (层序遍历) 三. 打开LeetCode 撸起来 至此, 咱多少被刚刚的后序非递归搞得可能有点小晕晕的, 没事,层序简单呀.... ...
- 深度优先搜索与广度优先搜索区别和案例
今天周末,心血来潮打开LeetCode做一道题: https://leetcode-cn.com/problems/number-of-enclaves/ 看到题,我的第一想法是: 从边缘的陆地开始, ...
- 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...
度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...
- 深度优先搜索和广度优先搜索的比较与分析
一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...
最新文章
- 微服务和 Serverless 如何强强联合?
- python画数组曲线_python – 在matplotlib中如何填充由两组不同数组定义的两条曲线?...
- 【HDU2037】今年暑假不AC
- ajax 载入html后不能执行其中的js解决方法
- WCF入门(八)——异常处理2
- Reporting Services 错误案例一则
- python生成器、迭代器、__call__、闭包简单说明
- window实用快捷键
- Lucene 全文搜索解析
- SQLite的使用(二):数据增删改查
- html js关闭浏览器,js关闭页面(兼容浏览器)
- python——os模块获取绝对路径
- c#后的完整cookie
- 用xslt 把xml转换成html的几个实例(1)
- wincc怎么做一个弹出画面_Wincc如何利用单个弹出窗口画面的模板,来实现调用多组画面参数?...
- 如何下载收费歌曲(不用任何软件插件,安全无毒)
- 揭开,字节跳动全链路压测的实践之路
- 微分方程(Differential Equation)
- Table [xx] contains physical column name referred to by multiple physical column names 错误处理
- [vdbench]vdbench典型配置
热门文章
- 如何提高PHP代码的质量?第三部分 端到端/集成测试
- php正则匹配域名不包含端口_3分钟短文 | PHP极速匹配子字符串,你是怎么做的?...
- 工程师软技能5:生产力
- cgo 调用dll Failed to load xxxxx.dll: The specified module could not be found.
- laravel的安装
- 详解SESSION与COOKIE的区别
- 分布式事务解决方案,Seata的基本配置和使用
- windows下mysql主从同步_详解windows下mysql的主从同步
- Java 实现 微信支付完成回调解密返回字符串内容
- Linux下必须知道的网络命令(持续更新)