Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3240|回复: 12

[已解决]从A到F,不能走重复路线,要求输出所有的走法

[复制链接]
发表于 2016-6-12 11:27 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2016-6-12 11:48 编辑

QQ截图20160612110835.jpg
2.rar (7.53 KB, 下载次数: 16)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-6-12 11:40 | 显示全部楼层
A B C B D F
A B C B D E F
这两个结果是不是有问题?

评分

参与人数 1 +5 金币 +5 收起 理由
爱疯 + 5 + 5 稍后,我改正

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-6-12 11:42 | 显示全部楼层
老司机带带我 发表于 2016-6-12 11:40
A B C B D F
A B C B D E F
这两个结果是不是有问题?

谢谢!!
好像是有问题,可能写错了
回复

使用道具 举报

发表于 2016-6-12 12:01 | 显示全部楼层
不就2*4吗?
回复

使用道具 举报

 楼主| 发表于 2016-6-12 12:06 来自手机 | 显示全部楼层
蝶·舞 发表于 2016-6-12 12:01
不就2*4吗?

谢谢蝶舞!
我不明白2*4是什么含义,这例子看上去不麻烦,可以数出来,我希望解决办法可以解决更复杂的情况,2*4是否也能解决?
回复

使用道具 举报

发表于 2016-6-12 12:16 | 显示全部楼层
A是第一梯队
B,C是第二梯队
D,E是第三梯队
F是第四梯队
第一梯队到第二梯队是二种路线
第二梯队到第三梯队是四种路线
第三梯队到第四梯队是二种路线
所以第一梯队到第四梯队一共是2*4*2=16种
但由于第二梯队到第三梯队时,终点是重复二次,所以16/2=8
回复

使用道具 举报

 楼主| 发表于 2016-6-12 12:34 来自手机 | 显示全部楼层
蝶·舞 发表于 2016-6-12 12:16
A是第一梯队
B,C是第二梯队
D,E是第三梯队

5楼意思我明白了,是说明走法的总个数。
假如要输出其中每一种走法,不知会不会很难?是不是能按什么套路来做?已知的条件怎样写在表中更好。。。。。
回复

使用道具 举报

发表于 2016-6-12 13:34 | 显示全部楼层
蝶·舞 发表于 2016-6-12 12:16
A是第一梯队
B,C是第二梯队
D,E是第三梯队

你这解释不对啊。

很简单。
第1层 2种分歧 A-B / A-C
第2层 也是各自多2种分歧 B-C/B-D 以及 C-B/C-E
第3层 又是各自多2种分歧 D-E/D-F 以及 E-D/E-F
第4层 只有1种分歧(如果有的话) D-F 以及 E-F  

因此,结果总数=2*2*2*1=8即可。无需考虑除以2





回复

使用道具 举报

发表于 2016-6-12 13:43 | 显示全部楼层
本帖最后由 香川群子 于 2016-6-12 14:24 编辑
爱疯 发表于 2016-6-12 12:34
5楼意思我明白了,是说明走法的总个数。
假如要输出其中每一种走法,不知会不会很难?是不是能按什么套路 ...

【已知的条件怎样写在表中更好】……这个确实是关键。

把问题条件用数学化语言进行表达,是必须的。

我想用列表方式可以。如:
A
B
A
C
B
C
B
D
C
B
C
E
D
E
D
F
E
D
E
F
这样10条有效线路即可。

估计用递归很容易解决的。



回复

使用道具 举报

发表于 2016-6-12 14:23 | 显示全部楼层    本楼为最佳答案   
递归
  1. Dim dic, k&, s2$
  2. Sub test() 'by kagawa 2016/6/12
  3.     Dim ar, i&, s1$

  4.     s1 = [a2]: s2 = [b2] '设置起点、终点
  5.     [d1].CurrentRegion.Offset(1) = "" '清空输出区域
  6.    
  7.     ar = [a4].CurrentRegion '读取路径关系表
  8.     Set dic = CreateObject("Scripting.Dictionary")
  9.     For i = 2 To UBound(ar)
  10.         dic(ar(i, 1)) = dic(ar(i, 1)) & "," & ar(i, 2) '路径关系写入字典
  11.     Next

  12.     k = 1: Call dg(s1, s1) '调用递归
  13.     MsgBox k - 1
  14. End Sub

  15. Sub dg(s$, t$) 's为历史路径记录,t为当前路径节点
  16.     Dim sr, i&, t2$
  17.     sr = Split(dic(t), ",") '读取字典中当前节点的有效子节点路径关系
  18.     For i = 1 To UBound(sr) '遍历有效子节点
  19.         t2 = sr(i) '读取子节点
  20.         If t2 = s2 Then '如果已到达终点
  21.             k = k + 1: Cells(k, 4) = s & t2: Exit Sub '则输出该路径后结束本次递归
  22.         Else
  23.             If InStr(s, t2) = 0 Then Call dg(s & t2, t2) '如果子节点未曾用过则进入下一层递归搜索
  24.         End If
  25.     Next
  26. End Sub
复制代码
其中,检查子节点是否已被利用过,这个很关键。 If InStr(s, t2) = 0

路径.rar

8.56 KB, 下载次数: 33

点评

光算出不行吧,像排列一样输出才知是什么。  发表于 2016-6-12 16:03

评分

参与人数 1 +3 收起 理由
老司机带带我 + 3 学习了,学递归十来年前的事了,忘光光了!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 07:03 , Processed in 0.669464 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表