深度优先搜索关键在于解决“当下该如何做”。至于“下一步如何做”则与当下该如何做“是一样的。

深度优先搜索模型:

void dfs(int step){判断边界,一般在这里输出最终的结果尝试每一种可能for(int i=1;i<=n;i++){标记继续下一步dfs(step+1);收回标记}返回
}

通常,需要book数组标记哪些牌已经使用或者记录格子已经在路径中(就是被使用)等等。使用过后一定要将book[i]收回

if (book[i]==0) {//将book[i]设为0,表示i号扑克牌还在手上
            //开始尝试使用扑克牌
            a[step]=i;  //将i号扑克牌放到第step个盒子中
            book[i]=1;  //将book[i]设为1,表示i号扑克牌已经不在手上
            
            //第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前
            dfs(step+1);//通过递归处理第step+1个盒子
            book[i]=0;  //非常重要,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
        }

if (a[tx][ty]==0&&book[tx][ty]==0) {

book[tx][ty]=1;     //标记这个点已经走过

dfs(tx, ty, step+1);    //尝试下一个点

book[tx][ty]=0;     //尝试结束,取消这个点的标记

}


4-1 代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>const  int max=1000;int a[10],book[10],n;//c语言全局变量在没有赋值以前默认为0
void dfs(int step){     //step表示站在第几个盒子面前if(step==n+1){      //如果站在第n+1个盒子面前,则表示前n个盒子已经放好扑克牌//输出一种排列for(int i=1;i<=n;i++)printf("%d",a[i]);printf(" ");return;         //return返回之前的一步,最近一次调用dfs函数的地方}//此时站在第step个盒子面前,应该放哪张牌呢?按照1,2,3···n的顺序试一下for (int i=1; i<=n; i++) {//判断扑克牌i是否还在手上if (book[i]==0) {//将book[i]设为0,表示i号扑克牌还在手上//开始尝试使用扑克牌a[step]=i;  //将i号扑克牌放到第step个盒子中book[i]=1;  //将book[i]设为1,表示i号扑克牌已经不在手上//第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前dfs(step+1);//通过递归处理第step+1个盒子book[i]=0;  //一定要将刚才尝试的扑克牌收回,才能进行下一次尝试}}
}
int main() {scanf("%d",&n);//输入n为1~9之间的整数dfs(1);printf("\n");return 0;
}

运行结果:

4-2代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>const  int max=1000;
int p,q,min=999999999,n,m;int book[51][51],a[51][51];void dfs(int x,int y,int step){int next[4][2]={{0,1},          //向右走{1,0},          //向下走{0,-1},         //向左走{-1,0}          //向山走};int tx,ty;//判断是否到达小哈的位置if (x==p&&y==q) {//更新最小值if(step<min)min=step;return;}//枚举4种走法for (int k=0; k<=3; k++) {//计算下一个点的坐标tx=x+next[k][0];ty=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;     //标记这个点已经走过dfs(tx, ty, step+1);    //尝试下一个点book[tx][ty]=0;     //尝试结束,取消这个点的标记}}
}
int main() {int startx,starty;scanf("%d %d",&n,&m);   //n行m列//读入迷宫for(int i=1;i<=n;i++)for(int 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\n",min);return 0;
}

《阿哈!算法》4-1不撞南墙不回头 4-2 解救小哈——深度优先搜索相关推荐

  1. “ 一条路走到黑,不撞南墙不回头”——C++【DFS(深度优先搜索算法)】入门讲解

    Hello,大家好,我是Amy,好久不见(我真好意思说好久不见)~ 虽迟但到,你们一直催更的dfs算法终于来啦~ 话不多说,让我们直接进入主题吧! 目录 缺点 简介 "地图类" 深 ...

  2. 算法简介:不撞南墙不回头----深度优先搜索算法(DFS)

    算法简介:不撞南墙不回头----深度优先搜索算法(DFS) 算法简介 算法简介 DFS算法简介 略 DFS算法思想 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访 ...

  3. 深度优先算法(一路走到底,不撞南墙不回头)

    一条路走到底,不撞南墙不回头,深度优先算法就是一个这样的'莽夫',然而就是一位这样的'莽夫',却是我们刷算法题的一个必不可少的制胜法宝. 深度优先算法特点: 只要前面有可以走的路,那就一直往前走,直到 ...

  4. c++ 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  5. 转不撞南墙不回头——树规总结

    之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的程序.而深搜的特点,就 ...

  6. 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  7. 【DFS】不撞南墙不回头—深度优先搜索算法[Deep First Search]

    今天上午听到,那个非常6+1的李咏先生因癌症去世 DFS算法的基本模型 深度下,不撞南墙不回头,就是一直往后找,知道没有路了,向后返回. 想起一首民谣,<可能否>--木小雅 https:/ ...

  8. 所谓的不撞南墙不回头

    只愿自己一派纯真,不撞南墙不回头 -- 挣扎在计算机领域的小萌新 (1) 回顾你过去三年的学习经历 ♥ 当初你报考的时候,是真正喜欢计算机这个专业么? 答: 报考啊...怎么说呢,我从高中的时候就已经 ...

  9. Scratch教学课程:不撞南墙不回头

    Hi,大家好,本次介绍Scratch的基础运用,内容如下: 使用角色制作动画并在舞台上移动 理解Scratch基本的运动.外观.条件控制等基础积木的应用. 响当当老师把本次的项目叫做:不撞南墙不回头. ...

最新文章

  1. 关于Java的Classpath详解
  2. 干货 | 《利用Python进行数据分析》资料开源下载
  3. IP与DSCP优先级
  4. 高压五防计算机软件安装,基于Android的新一代五防钥匙软件系统
  5. 中国台湾地区几乎所有院校的硕博论文库(部分可下全文)分享该日志 举报...
  6. 使用SAP WebIDE进行一个典型的bug修复流程
  7. API网关和AWS Lambda进行身份验证
  8. linux中权限的名词解释,Linux的基本权限和特殊权限
  9. 解决 mysql 插入数据报错: Cannot add or update a child row: a foreign key constraint fails
  10. quill鼠标悬浮 出现提示_jQuery实现鼠标悬停显示提示信息窗口的方法
  11. Springboot+Spring-Security+JWT 实现用户登录和权限认证
  12. 科技公司 CEO 合谋“诈骗”自家公司超 900 万美元,现已被捕
  13. php 基础 自动类型转换
  14. source ./ 和 . 的区别
  15. PyCharm创造起名自动生成起名·创造者·日期·时间模板
  16. 《Adobe Flash CS4中文版经典教程》——1 FLASH CS4快速入门1.1 启动Flash并打开文件...
  17. SaaSpace:最好的免费网络安全工具
  18. 窝囊同事做测试三年未涨工资,被开当天,bat全部高管门口迎接。
  19. 迅雷离线下载分享网站
  20. Fireball真相:一个菜鸟级流氓软件竟让老外如临大敌

热门文章

  1. zotero+谷歌翻译不能用,最后的解决方案!
  2. canvas教程大纲
  3. 初探HazelCast IMDG内存数据网格-简介
  4. 北京博物馆十大镇馆之宝
  5. java 简单文件加密
  6. 野生的男人,家养的猪
  7. 编译原理 | 实验四 | 逆波兰式
  8. H264码流中SPS的获取
  9. mixamo骨骼_mixamo动作库的模型和动作绑定控制器的方法-上集
  10. Spring Boot 快速入门(二)主配置文件、yml配置文件语法