深度优先搜索

全排列问题:
理解深度优先搜索的关键在于:
解决当下该如何做,至于下一步该如何做则与当下该如何做是一样的的操作。
深度优先搜索基本模型

void dfs(int step)
{判断边界尝试每一种可能for(int i=1;i<=n;i++){继续下一步dfs(step+1);}return;
}
#include <stdio.h>int a[10],book[10],n;//C语言的全局变量在没有赋值前默认为0,所以数组不用赋值了void dfs(int step)//step表示站在第几个盒子面前
{int i;if(step==(n+1))//表示前面n 个盒子已经安排好了{//输出一种排列,(1-n盒子中的扑克牌编号)for (int  i = 1; i <= n; i++){printf("-%d",a[i]);  }printf("\r\n");return;//返回之前一步,也即最近调用dfs函数的地方}//此时站在第step个盒子面前,应该放那张牌呢?//按照 1-2-3-4-----n的顺序一一尝试for (int i = 1; i <= n; i++){if(book[i]==0)//如果扑克i还在手上{//开始 常识使用扑克ia[step]=i;//将扑克i放入第step个盒子中book[i]=1;//表示扑克i已经不在手中//第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前dfs(step+1);//通过函数的递归调用来实现book[i]=0;//将刚才常识的扑克牌收回,才能进行下一次的常识}}return;
}int main(int argc, char const *argv[])
{printf("Input a int num between 0-9:\r\n");scanf("%d",&n);dfs(1);//首先站到第一个盒子面前return 0;
}

运行结果:

用深度优先搜索解决:口口口+口口口=口口口的问题
(填入1~9,每个只能用一次,使等式成立)

#include <stdio.h>/*解决abc+efg=hij的问题
*数字为1~9
*/int n,a[10],book[10];//全局变量默认值为0void dfs(int step)
{int i;if(step==10)//n 个数,此时说明前面的n 个数已经安排好了{if (((a[1]*100+a[2]*10+a[3])+(a[4]*100+a[5]*10+a[6]))==(a[7]*100+a[8]*10+a[9])){printf("%d%d%d+%d%d%d=%d%d%d\r\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);//打印已经安排好的排列n++;}return;}for(int i=1;i<=9;i++){if (book[i]==0)//说明牌还在手上     {a[step]=i;book[i]=1;dfs(step+1);book[i]=0;}}return;
}int main(int argc, char const *argv[])
{dfs(1);printf("Total:%d\r\n",n/2);return 0;
}

运行结果:

深度优先搜索,迷宫寻找小哈:


最开始在(1,1)只能向右走或者向下走,一个小哼只能向下走或者向右走,我们这里一个一个试,先让小哼向右走,走不通的时候在想下走,这里我们规定走的方向为: 右、下、左、上

用深度优先搜索来解决:
dfs()函数解决的功能是,当前应该怎么办,而当小哼在某个点的时候应该处理的是:先判断是否已经到达小哈的位置,如果没有到达则找到下一步的位置。

#include <stdio.h>int m,n,q,p,min=999999;int a[51][51],book[51][51];void dfs(int x,int y,int step)
{int next[4][2]={//这里的x和y代表的是行和列,{0,1},//向右走**也即行不变,列+1{1,0},//向下走**列不变,行+1{0,-1},//向左走**行不变,列-1{-1,0}//向上走**行-1,列不变};int tx,ty,k;//判断是否到达小哈的位置if(x==p && y==q){if(step<min)min=step;return;}//枚举四种走法,方向为右、下、左、上for (k = 0; k <= 3; k++){//计算下一个点的坐标/*当k=0时,tx=x+0;ty=y+1;*当k=1时,tx=x+1;ty=y+0;*当k=2时,tx=x+0;ty=y-1;*当k=3时,tx=x-1;ty=y+0;*/tx=x+next[k][0];ty=y+next[k][1];//判断是否越界if (tx<1||ty<1||tx>n||ty>m) {continue;//下面的代码不执行,重新回归继续for循环}//判断该点是否为障碍物或者已经在路径之中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(int argc, char const *argv[])
{int i,j,startx,starty;//读入迷宫的行和列,n为行,m为列printf("Input the map size:\r\n");scanf("%d %d",&n,&m);//读取迷宫for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&a[i][j]);//二维数组a用来保存地图}}//读入迷宫的起点和终点printf("Input the start and the ending:\r\n");scanf("%d %d %d %d",&startx,&starty,&p,&q);//从起点开始搜索 book[startx][starty]=1;//标记起点已经在路径中,防止重复走----二维数组book用来存储已经走过的点dfs(startx,starty,0);//从起点开始,走过的路程为0printf("The min length is: %d\r\n",min);return 0;
}

运行结果:

啊哈,算法自学记——6th相关推荐

  1. 啊哈,算法自学记——9th

    最短路径: 找出1号点到5号点的最短路径(单向路线) 首先,5个点用个5*5的二维数组来存储这个地图 空格的值代表两个点之间的距离,∞表示无法到达,用999999来代替 #include <st ...

  2. WEKA算法开发——记一次不太成功的遗传属性加权贝叶斯算法实验

    WEKA算法开发--记一次不太成功的遗传属性加权贝叶斯算法实验 1. WEKA介绍 2. 使用WEKA开发自己的算法 3. ~~总结~~ 吐槽 1. WEKA介绍 Weka平台是一种数据分析+模式识别 ...

  3. 【算法随记一】Canny边缘检测算法实现和优化分析。

    以前的博文大部分都写的非常详细,有很多分析过程,不过写起来确实很累人,一般一篇好的文章要整理个三四天,但是,时间越来越紧张,后续的一些算法可能就以随记的方式,把实现过程的一些比较容易出错和有价值的细节 ...

  4. wifi定位算法 java_记一次APP的so层算法逆向(七)

    " 前言:初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了..." 学习到的内容 - 1.新学习到IDA的一些分析时候的小技巧 2.算法还原代码实现的练习(有个参数没有分 ...

  5. RANSAC算法注记

    今天学习了一下RANSAC随机样本一致性算法,其在图像融合.特征点匹配方面有很强大的应用.网上已经有很多人写了关于这方面的文档,就不再造轮子了.特此罗列出来,以供后续参考. 我的数学之美(一)--RA ...

  6. Rust 算法排位记 - 插入排序的图示和代码实现

    Rust 代码在编写过程中与其它语言的略有不同,因为它的编译器不允许有任何不安全的写法,遂代码编写过程中花费时间最长的莫过于查找编译报错的原因.这样也有好处--代码写好之后,稳定性高得一笔! 以下是来 ...

  7. Rust 算法排位记-选择排序图示与代码实现

    听说你们在家闷得快要发霉了,来点新鲜的吧.集中注意力,让时间过得更快一些! 以下是来自菜鸟教程中的排序过程和动图示意: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 再从剩余未排序 ...

  8. 【算法随记五】使用FFT变换自动去除图像中严重的网纹。

    这个课题在很久以前就已经有所接触,不过一直没有用代码去实现过.最近买了一本<机器视觉算法与应用第二版>书,书中再次提到该方法:使用傅里叶变换进行滤波处理的真正好处是可以通过使用定制的滤波器 ...

  9. 算法自学笔记:Convex Hull问题

    convex hull是一个计算机几何问题.对于平面上N个坐标不同的点,如何选取并连接其中部分点构成一个多边形使得该平面所有点都被包括在这一多边形内.如图: 对于输入的任意一组点,输出构成convex ...

最新文章

  1. 记一次CentOS7内核kernel的删除重装
  2. 20170307-1
  3. [CTO札记]防盗版新思路:招安
  4. 利用shell脚本结合hive语句进行数据加载时的优化
  5. Map集合的几种遍历方式
  6. .NET : 动态生成工作流定义文件并且进行编译
  7. CLEARTEXT communication to xxx not permitted by network security policy
  8. 比SOTA模型更全能!商汤科技和上海人工智能实验室联手打造统一模型架构UniFormer...
  9. RAC IP 地址修改
  10. 数据结构 —— 在线操作与离线操作
  11. linux-history历史命令-光标的移动操作-命令行上的字符删除操作
  12. jenkins ssh 部署 Can't connect to server 错误
  13. Linux文件权限的解析
  14. 【离散数学笔记】图的基本概念思维导图
  15. 没有方案你抱怨;有了方案你会认真看吗?
  16. mongodb的安装和使用
  17. MySQL-3个表连接、左连接、右连接-2021/09/06
  18. [2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
  19. 域用户的管理之一次同时对多个用户进行管理
  20. centos linux 修改系统默认语言设置,centos怎么更改语言设置为中文

热门文章

  1. 集成学习方法之随机森林
  2. 超级应用程序的图标设计系统
  3. Vue使用echarts(完整版,解决各种报错)
  4. java山海经之轩辕_《山海经》中所说的轩辕国在哪,是否就是华夏文明的起源?...
  5. 手机端点击图片放大特效-PhotoSwipe插件
  6. 2022年在uniapp中引入vant Weapp
  7. Checksum算法
  8. 地铁闸门会夹伤人吗_地铁闸机夹人该如何解决?
  9. Github 4 万 Star!最全面的 Node.js 资源汇总推荐
  10. 张钹院士:场景是当前AI产业化最大问题