主题:关于 排列&组合——深搜解法
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个回复)
11 楼
faintzw [专家分:2660] 发布于 2004-09-08 21:08:00
我真的举了不少例子了啊!
你查一下我发起的主题。大部分都有吧
12 楼
jinjhl [专家分:50] 发布于 2004-09-08 21:19:00
我查您的资料,是河南的吧,我老家也是啊,老乡阿。
13 楼
faintzw [专家分:2660] 发布于 2004-09-08 21:27:00
这么巧?呵呵
14 楼
jinjhl [专家分:50] 发布于 2004-09-08 21:30:00
我老家是周口地区的,西华县,很落后的地方,您呢?
15 楼
faintzw [专家分:2660] 发布于 2004-09-08 21:34:00
别叫“您”,我受不起的
我老家也不先进,安阳县,一个小村里。
现在在郑州上学
16 楼
jinjhl [专家分:50] 发布于 2004-09-08 21:37:00
都58岁了还上学呀,开玩笑吧!
17 楼
faintzw [专家分:2660] 发布于 2004-09-08 21:42:00
谁58了?你说我论坛上啊?倒。。我都是胡乱填的
我18都不到。。。今年6月过15的生日
18 楼
jinjhl [专家分:50] 发布于 2004-09-08 21:45:00
hahahahahahaha........
19 楼
qblover [专家分:30] 发布于 2004-10-08 20:14:00
今天第一次尝试递归,也是第一次尝试算法,今后想多熟练一下.
Cls
INPUT n, m
Dim a(m)
t = 0
GoSub ks
Print p
End
ks: t = t + 1
a(t) = 0
Do While a(t) < n
a(t) = a(t) + 1
For k = 0 To t - 1
If a(t) = a(k) Then GoTo ks1
Next k
If t = m Then '设置递归层次为m.
For k = 1 To m
Print a(k); " ";
Next k
Print
p = p + 1
GoTo ks1
Else
GoSub ks '递归,递推
t = t - 1 '回归
GoTo ks1
End If
ks1: Loop
Return
20 楼
qblover [专家分:30] 发布于 2004-10-08 20:24:00
以前我总是傻呼呼地用多层循环,很辛苦.
我来回复