主题:关于 排列&组合——深搜解法
faintzw
[专家分:2660] 发布于 2004-08-17 20:35:00
近几天在坛子上见人讨论关于排列和组合的求法,我贴出我的程序,请大家过目
在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 楼
faintzw [专家分:2660] 发布于 2004-10-09 00:00:00
1、少用goto或者gosub之类的,尤其不要用来实现递归
2、多注意一下代码的风格,这样挤在一起很难看清楚
另,那个是回溯,不是回归
22 楼
ddr400yk [专家分:820] 发布于 2004-10-09 19:33:00
有PASCAL版的吗??
23 楼
faintzw [专家分:2660] 发布于 2004-10-09 21:59:00
PAS的。。。我记得我都删了。也懒得再写了。。。
24 楼
faintzw [专家分:2660] 发布于 2004-10-09 22:02:00
算法这么简单,用TP实现也很简单的
25 楼
moz [专家分:37620] 发布于 2005-04-25 14:23:00
呵呵,我是很落后
现在才看到一年前的贴
楼主把这东西做成函数也很利害
我知道天上有星星,但星星叫什么名字我就不知道了
终于看明白了高手的深搜框架是什么意思了
这种问题我以前也考虑了很多办法
我只想到了用do和数组变量来代替不定量崁套的for
运用效率还可以,但易懂性就比不上楼主了
只是我一般不大敢用函数多重递归的
在QB中堆栈是很有限的
所以很有危险性
只是一点点肤浅的看法,请勿介意
26 楼
moz [专家分:37620] 发布于 2005-04-25 14:29:00
终于见到深搜解法了
对这名称没什么了解
方法是看到了
我用的就类似19楼的方法
只是的确需要尽量避免使用过多的
gosub和goto语句
叫什么方法或叫什么名称并不重要
抓老鼠不会太慢就行了,呵呵
27 楼
faintzw [专家分:2660] 发布于 2005-04-25 14:51:00
堆栈空间任何语言都有限的……但是楼上的应该知道qb有个clear ,,stack语句吧?
这里介绍的深搜其实也只是深搜的一个最基本方法而已。你的那个方法是回溯,也是深搜的一部分(这里的也是回溯)。
关于楼上的抓老鼠问题,名字不统一的话会导致只有你自己能看到你抓到的老鼠吧
28 楼
li010450 [专家分:70] 发布于 2005-05-10 20:38:00
Good!
29 楼
moz [专家分:37620] 发布于 2005-07-17 19:37:00
再顶
强烈推荐学习
----深搜框架
30 楼
163111511 [专家分:90] 发布于 2005-07-20 16:37:00
顶!!
我来回复