深度优先搜索 - 简单demo

输入一个数n,输出 1 ~ n 的全排列,例如输入 3,全排列则为:123,132,213,231,312,321 一共六种。

这里采用深度优先搜索来解决这个问题:

#include<stdio.h>

int n;
int a[10],book[10];

//递归核心代码
void dfs(int step)
{
    if(step == n+1){    //递归结束条件
        for(int i=1;i<=n;i++){
            printf("%d",a[i]);
        }
        printf("\n");

        return; //返回上一步
    }else{
        for(int i=1;i<=n;i++){//当下该怎么做
            if(book[i]==0){
                book[i]=1;    //进行放入
                a[step]=i;    //放入第step步
                dfs(step+1);  //深度下一节
                book[i]=0;    //进行回收(非常重要的一步)
            }
        }
        return;
    }
}

int main()
{
    scanf("%d",&n);
    dfs(1);
    getchar();
    return 0;
}

理解深度优先搜索的关键在于解决“当下该如何做”。至于“下一步如何做”,则与“当下该如何做”事一样的。下面代码就是深度优先搜索的基本模型。

void dfs(int step){
  //判断边界
  //尝试每一种可能
  for(int i = 1; i <= n; i++){
      //继续下一步
      dfs(step+1);
  }
}

代码解读:

  当我们输入12,代码执行,一路执行,放入数字

  一路到1,2,3,4,5,6,7,8,9,10,11,12,这时候在下一节点碰到 step == n+1,

  已经没有下一节点了,直接输出全排列,1,2,3,4,5,6,7,8,9,10,11,12,同时进行返回,返回到第12步,

  第12步执行回收代码:book[i] = 0 ,将12回收,继续退回到11步,

  在第11步,先回收了11,在for循环中,继续前进,到达第12次for循环,因此放入12,继续深度下一节点

  此时,只剩下11,放入,继续下一节点,碰到 step == n+1

  已经没有下一节点了,直接输出全排列,1,2,3,4,5,6,7,8,9,10,12,11,同时进行返回,返回到第12步,

  在第12步回收代码。。。。。。。

  一次类推,直至全部搜索完毕

 

原文地址:https://www.cnblogs.com/zhenghongxin/p/9489661.html

时间: 2024-08-05 17:40:25

深度优先搜索 - 简单demo的相关文章

人员分配问题(简单的深度优先搜索题目)

问题描述 某单位有若干人员,现执行某任务需要一定人数人员.编写程序,输入单位人数和每位员工名字,再输入执行任务所需人数,输出所有可能派出人员方案 程序代码 #include<bits/stdc++.h> using namespace std; char s[10][20]; //存放读进来的人的名字,暂定人最多为10个 char ans[10][20]; //存放每一次生成的结果 int maxMan = 0; //存放执行任务所需人数 int times = 0; //存放总方案数 int

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

POJ 1979 Red and Black 深度优先搜索上手题

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21738   Accepted: 11656 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a

算法7-3:深度优先搜索

深度优先搜索最初是因为迷宫游戏而诞生的.在一个迷宫中,有一个入口和一个出口,其中只有一条路径能从入口到达出口.在走迷宫的时候,每次将走过的地方进行标记,遇到死胡同的时候可以沿着进来的路线后退,找到新的没走过的拐角再尝试新的路线.这种方法的效率很高,因为每个地方只需要走过一次即可.其实,这就是深度优先搜索. 深度优先搜索的目标就是系统化地遍历整个图,让算法的效率更高. 应用 深度优先搜索有几个非常典型的应用: 找出源顶点能到达的所有顶点 找出两个顶点之间的路径 判断两个顶点是否连通 基本思想 深度

“生动”讲解——深度优先搜索与广度优先搜索

深度优先搜索(Depth First Search,DFS) 主要思想:不撞南墙不回头 深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点:当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问. 沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止. 图解: 分析: 通过上面的图例可以非常直观的了解深度优先搜索的工作方式.下面来分析一下如何用代码来实现它. 大家都知道,深度

从排列到组合——深度优先搜索

前段时间在洛谷3.0上刷到一个题,让本人挠头了一段时间,RT: 题目描述 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. 首先解决这个问题显

深度优先搜索(Depth-First-Search)精髓

引例:迷宫问题 首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出口出来.那老鼠会怎么走?当然可以是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选择其中的一条继续往下走,如果遇到死胡同,就退回到最近的一个分叉路口,选择另一条道路再走下去,如果遇到了出口,老鼠的旅途就算成功结束了.  深度优先搜索的基本原则就是这样:按照某种条件往前试探搜索,如果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到满足条件的目标为止.  递归程序设计 然而

回溯 DFS 深度优先搜索[待更新]

首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别的路径 也就是说 走到死胡同里边就往回走,直到找到出口. 回溯 是一种 选优搜索 .许多复杂规模较大的问题都可以用 回溯 解决 ,因此回溯法有 "通用解题方法"的美称. 2.思想 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束.而 若使用回溯法求任一个解时,只要搜

深度优先搜索与全排列

做题过程中我们经常会遇到这样的问题: 输入一个数n,输出1-n的全排列.可能很多人会想到枚举暴力,这里给大家介绍一种算法:深度优先搜索 在这里举个简单的例子 假如有编号为1 .2.3 的3 张扑克牌和编号为l .2 .3 的3 个盒子. 现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌.那么一共有多少种不同的放法呢? 首先 我们应该设置一个标志数组 book 记录当前数字是否被使用过. 然后用一个数组a 表示盒子并且初始化a[i]=i; 代码如下: #includ