主题:关于 排列&组合——深搜解法
			
 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				
				以前我总是傻呼呼地用多层循环,很辛苦.
							 
									
			
我来回复