python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果。那是非常大的。今天我就来介绍用深度优先搜索来解决这个数的全排列的问题。

深度优先搜索

首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样。深度优先搜索的基本模型为:

dfs(step):
    判断边界:执行相关操作,返回
    尝试每一种可能 for( i = 1; i <=n; i++):
        继续下一步 dfs(step+1)
    返回

数的全排列问题

回到数的全排列的问题。注:以下代码用来介绍程序核心思想,并不能直接运行,只有完整代码才能执行,step从1开始算。

我们用一个数组book=[]来记录我们那个数字已经选中了。用result来记录我们的结果。

首先,我们先来解决最简单的问题:将没有的选中的数字选一个出来,放到对应的数位上。所以将下面的代码翻译过来,就是将第step位设置为i+1(i是从0开始的,所以要加一,假设我们的数列没有0,每个数不重复),并将i标记为已选中(book[i] = 1)

for i in range(n):
    if book[i] == 0:
        result[step] = i+1
        book[i] = 1

然后,处理下一步:

def dfs(step):
    for i in range(n):
        if book[i] == 0:
            a[step] = i
            book[i] = 1
            dfs(step+1)
            book[i] = 0

最后处理边界情况,当步数step与数列位数+1相等时,输出结果:

if step == n+1:
    printf result
    return

不停的重复以上的步骤,就能列出所有的结果

接下来是完整的代码:

# -*- coding:utf8 -*-
‘‘‘
简介:本程序主要简单实现深度优先搜索算法(depth first search)
      并用解决数的全排列的问题。
实现方法:递归
作者:陈栋权
2016/9/24    第一次发布
‘‘‘

class DFS(object):
    ‘‘‘
    numlen: 为有几位数字,如3,则为1,2,3
    result: 用来保存个序列的结果
    book: 用来判断那个数字已经排列了
    ‘‘‘
    def __init__(self, n):
        self.numlen = n
        self.result = [0 for i in range(n)]
        self.book = [0 for i in range(n)]

    def dfs(self, s):
        step = s-1
        if step == self.numlen:
            r = ‘‘
            for i in range(self.numlen):
                r += str(self.result[i])

            print r
            return

        # 用来尝试每种可能,即第step位的数为i
        for i in range(self.numlen):
            if self.book[i] == 0:
                self.result[step] = i+1
                self.book[i] = 1
                self.dfs(s+1)
                self.book[i] = 0
        return

完整代码

时间: 2024-10-11 06:43:29

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题的相关文章

深度优先搜索(DFS: Depth First Search)

深度优先搜索是一种树的遍历方式.与此对应的是广度优先搜索. ? 二叉树的优先搜索: ? 如何把一个数学问题转换为树的深度优先搜索问题: 例如:各位数之和为偶数的一个10位二进制数有几个. 我们来分析一下这个问题,首先一共有10位数,然后每一位数都只有两种状态0,1 这可以看做是一个深度为10的一个二叉树,然后用树的深度优先搜索即可解决问题. ? 用C语言实现的代码结构 void DFS(int depth) { ????if(depth==10)????????//递归出口 ????{ ????

[LeetCode OJ] Word Search 深度优先搜索DFS

Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be us

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

DFS --- Depth First Search 深度优先搜索算法

Depth First Search 原理还是去看<DSAA>,这里着重分析实现策略. 如果对于图这种数据结构不熟悉,这个BFS一般是搞不定的... 下面分别是无向图的邻接表实现和邻接矩阵实现 http://blog.csdn.net/cinmyheart/article/details/41381845 http://blog.csdn.net/cinmyheart/article/details/41370465 --------------------------------------

深度优先搜索(dfs)

关于深度优先搜索的总结: 1 dfs 的基本结构:  void dfs(int x){ if( x 超出边界){ return ; }else{ for(遍历){ if(未访问过){ 访问         ; 打上标记    ; dfs(x + 1) ; 去掉标记    ; //极易忘记 } } } return; } 2 用dfs求全排列: 本来好好的,结果sizeof(pointer) 就完蛋了.神秘的内存错误,而且还能正常的跑出一个不正常的结果出来. 想了解sizeof这个小妖精的看这里

深度优先搜索DFS (poj2386,poj1979, poj3009,poj1321,aoj0033,aoj0118)

深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake Couting 题意:八连通被认为连接在一起,求总共有多少个水洼? Sample Input: 10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.

深度优先搜索DFS和广度优先搜索BFS

DFS简介 深度优先搜索,从起点开始按照某个原则一直往深处走,直到找到解,或者走不下去,走不下去则回溯到前一节点选择另一条路径走,直到找到解为止. BFS简介 广度优先搜索,从起点开始先搜索其相邻的节点,由此向外不断扩散,直到找到解为止. 举例解释 从1开始去寻找5 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1 2.5     5.3 5出来则找到 遍历图中所有点 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1

深度优先搜索 DFS(Depath First Search, DFS)

深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法.(不撞南墙不回头) DFS一般用递归来实现,其伪代码思路过程一般如下: void DFS(必要的参数){    if (符和遍历到一条完整路径的尾部){        更新某个全局变量的值    }    if (跳出循环的临界条件){        return;    }    对所有可能出现的情况进行递归} 常见题型1: 代码实现: 1 #include <stdio.h> 2 const int maxn = 30; 3 in