码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-24 16:01:50      阅读:518      评论:0      收藏:0      [点我收藏+]

标签:

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有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
完整代码

 

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

标签:

原文地址:http://www.cnblogs.com/king-ding/p/dfs.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!