回 帖 发 新 帖 刷新版面

主题:关于 排列&组合——深搜解法

近几天在坛子上见人讨论关于排列和组合的求法,我贴出我的程序,请大家过目

在M$中任选K个字母。

排列:
DECLARE SUB dfs (d!)
CLS
CONST maxn = 100
DIM SHARED a(maxn), used(maxn), l, k, m$

INPUT m$, k
l = LEN(m$)
CALL dfs(1)


SUB dfs (d)
IF d - 1 = k THEN
FOR i = 1 TO k: PRINT MID$(m$, a(i), 1); : NEXT i
PRINT
ELSE FOR i =  1 TO l
       IF used(i) = 0 THEN
         used(i) = 1
         a(d) = i
         dfs (d + 1)
         used(i) = 0
       END IF
     NEXT i
END IF
END SUB


组合:
DECLARE SUB dfs (d!)
CLS
CONST maxn = 100
DIM SHARED a(maxn), used(maxn), l, k, m$

INPUT m$, k
l = LEN(m$)
CALL dfs(1)


SUB dfs (d)
IF d - 1 = k THEN
FOR i = 1 TO k: PRINT MID$(m$, a(i), 1); : NEXT i
PRINT
ELSE FOR i = a(d - 1) + 1 TO l    '细心的人也许已经发现,组合和排列只在这一处改动了1个数
       IF used(i) = 0 THEN
         used(i) = 1
         a(d) = i
         dfs (d + 1)
         used(i) = 0
       END IF
     NEXT i
END IF
END SUB


算法为DFS,深度优先搜索。
欢迎发表意见或建议,新手有不明白也欢迎提问。

回复列表 (共34个回复)

21 楼

1、少用goto或者gosub之类的,尤其不要用来实现递归
2、多注意一下代码的风格,这样挤在一起很难看清楚

另,那个是回溯,不是回归

22 楼

有PASCAL版的吗??

23 楼

PAS的。。。我记得我都删了。也懒得再写了。。。

24 楼

算法这么简单,用TP实现也很简单的

25 楼

呵呵,我是很落后
现在才看到一年前的贴
楼主把这东西做成函数也很利害
我知道天上有星星,但星星叫什么名字我就不知道了
终于看明白了高手的深搜框架是什么意思了
这种问题我以前也考虑了很多办法
我只想到了用do和数组变量来代替不定量崁套的for
运用效率还可以,但易懂性就比不上楼主了
只是我一般不大敢用函数多重递归的
在QB中堆栈是很有限的
所以很有危险性
只是一点点肤浅的看法,请勿介意

26 楼

终于见到深搜解法了
对这名称没什么了解
方法是看到了
我用的就类似19楼的方法
只是的确需要尽量避免使用过多的
gosub和goto语句
叫什么方法或叫什么名称并不重要
抓老鼠不会太慢就行了,呵呵

27 楼

堆栈空间任何语言都有限的……但是楼上的应该知道qb有个clear ,,stack语句吧?
这里介绍的深搜其实也只是深搜的一个最基本方法而已。你的那个方法是回溯,也是深搜的一部分(这里的也是回溯)。

关于楼上的抓老鼠问题,名字不统一的话会导致只有你自己能看到你抓到的老鼠吧

28 楼

Good!

29 楼

再顶

强烈推荐学习

----深搜框架

30 楼

顶!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册