一.深度优先搜索。

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); } 

在学习的过程中发现其实无论深度还是广度时间复杂度都是相当的高,(每一个节点都得遍历一遍又能低到哪去?),虽然数据结构才刚刚入门,但是真的可以感觉到算法的魅力

深度优先搜索及广度优先搜索相关推荐

  1. 八数码深度优先搜索_深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...

  2. 算法十——深度优先搜索和广度优先搜索

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 搜索算法 算法是作用于数据结构之上的.深度优先搜索.广度优先搜索是作用于图这种数据结构之上的.图上的搜索 ...

  3. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索

    什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...

  4. 深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 ​ 在人工智能的运筹学的领域中求解与图相关的应用中,这两个算法被证明是非常有用的,而且,如需高效地研究图的基本性质,例如图的连通性以及图是否存在环,这些算法也是必不可少的. ...

  5. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  6. 迷宫问题:深度优先搜索和广度优先搜索

    迷宫问题:深度优先搜索和广度优先搜索 1.深度优先搜索可以使用栈实现,栈顶元素为当前节点 2.当前节点搜索下一节点,判断节点是否走得通,如果走得通任意方向走一步,走不通一直弹出栈内元素,直到走得通 3 ...

  7. 学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举

    目录 一. 图解二叉树的深度优先搜索 二. 二叉树的广度优先搜索  (层序遍历) 三. 打开LeetCode 撸起来 至此, 咱多少被刚刚的后序非递归搞得可能有点小晕晕的, 没事,层序简单呀....  ...

  8. 深度优先搜索与广度优先搜索区别和案例

    今天周末,心血来潮打开LeetCode做一道题: https://leetcode-cn.com/problems/number-of-enclaves/ 看到题,我的第一想法是: 从边缘的陆地开始, ...

  9. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

  10. 深度优先搜索和广度优先搜索的比较与分析

    一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...

最新文章

  1. Python代码转Latex公式,这个开源库用一行代码帮你搞定
  2. 个人博客开发-01-nodeJs项目搭建
  3. Sqlserver中使用ISNULL、CAST、CASE完成对jsTree数据的查询
  4. CentOS7.7安装MySQL5.6并配置环境变量(详细版)
  5. Python测试开发django3.视图和URL配置
  6. ps css html,用ps两分钟做个xhtml+css的网站首页
  7. java分页插件_IT系统分页
  8. paip.TechExcel DevSuite IIS 根目录结构
  9. php网站整合ck播放器,wordpress主题整合ckplayer播放器
  10. javawebJSP餐厅点餐系统源码JSP点餐系统JSP网上订餐系统JSP在线订餐系统JSP外卖系统
  11. 数据库MDF数据文件数据库恢复
  12. 自动控制原理第2章——自动控制系统的数学模型(思维导图)
  13. php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
  14. Python根据已知Y值求斜率和截距
  15. 肇庆学院计算机励志奖学金,关于评选肇庆学院2019年国家奖助学金的通知
  16. MySQL日期和时间函数 整理
  17. 用AI变革新药研发,终极目标是延缓衰老,这家创业公司迎来“里程碑”
  18. 慕课软件质量保证与测试(第三章.课后作业)
  19. miui10读取不了u盘_u盘能识别但无法读取_u盘无法识别如何修复
  20. 基于多目标粒子群算法的冷热电联供型综合能源系统运行优化。 包括燃气轮机,燃气锅炉,电制冷机等设备。

热门文章

  1. [转]使用jQuery获取radio/checkbox组的值的代码收集
  2. Silverlight C# 游戏开发:L5 3D基本的灯光
  3. Saying Good-bye to Cambridge Again --by Xu Zhimo
  4. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
  5. 结合Kubernetes解读微服务的12要素
  6. python--文件
  7. iview 后台管理系统 搭建
  8. Redis数据结构-对象
  9. 基于Libevent最小根堆定时器的C++定时器实现
  10. 给大家推荐几位顶级Go语言专家写的公众号