回 帖 发 新 帖 刷新版面

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

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

在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 楼

我真的举了不少例子了啊!

你查一下我发起的主题。大部分都有吧

12 楼

我查您的资料,是河南的吧,我老家也是啊,老乡阿。

13 楼

这么巧?呵呵

14 楼

我老家是周口地区的,西华县,很落后的地方,您呢?

15 楼

别叫“您”,我受不起的
我老家也不先进,安阳县,一个小村里。
现在在郑州上学

16 楼

都58岁了还上学呀,开玩笑吧!

17 楼

谁58了?你说我论坛上啊?倒。。我都是胡乱填的
我18都不到。。。今年6月过15的生日

18 楼

hahahahahahaha........

19 楼

今天第一次尝试递归,也是第一次尝试算法,今后想多熟练一下.

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 楼

以前我总是傻呼呼地用多层循环,很辛苦.

我来回复

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