Foxtable(狐表)用户栏目专家坐堂 → 排班(遍历)方法思路求教


  共有7495人关注过本帖树形打印复制链接

主题:排班(遍历)方法思路求教

帅哥哟,离线,有人找我吗?
一笑
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
排班(遍历)方法思路求教  发帖心情 Post By:2018/2/22 21:34:00 [只看该作者]

想做了一个排班系统,如下图所示:

图片点击可在新窗口打开查看此主题相关图片如下:排班思路.png
图片点击可在新窗口打开查看

从候选人中选取1名作为每一组的司机,每组司机不能相同,比如第1组选定张三后,其他组都不能选取。想用遍历的方法选出5组司机,并计算总共有多少种可能性,比如:1. 张三2李四3王二4刘备5孙子;1. 李四2张三3王二4刘备5孙子;请教一下代码的思路,菜鸟,谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/22 22:05:00 [只看该作者]

如果层数是固定的,建议直接写多层循环,否则,就需要写成递归。下面代码,是三层的,看懂代码

 

Dim dt As DataTable = DataTables("表A")
Dim drs = dt.Select("第二列 is not null")
Dim s0 As String = drs(0)("第二列")
For Each ss0 As String In s0.split(",")
    Dim s1 As String = drs(1)("第二列")
    Dim ls As new List(Of String)
    ls.add("")
    ls.add("")
    ls.add("")
    ls(0) = ss0
    For Each ss1 As String In s1.split(",")
        If ls.contains(ss1) Then Continue For
        ls(1) = ss1
        Dim s2 As String = drs(2)("第二列")
        For Each ss2 As String In s2.split(",")
            If ls.contains(ss2) Then Continue For
            ls(2)= ss2
            output.show(String.Join("|", ls.ToArray))
        Next
    Next
Next


 回到顶部
帅哥哟,离线,有人找我吗?
一笑
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2018/2/23 11:15:00 [只看该作者]

谢谢,代码看懂了。层数不固定,能不能请教一下递归代码,谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/23 11:36:00 [只看该作者]

loop函数

 

Dim drs = args(0)
Dim ls = args(1)
Dim level = args(2)
If level = drs.count Then
    output.show(String.Join("|", ls.ToArray))
Else
    For Each s As String In drs(level)("第二列").split(",")
        Dim iscontains = False
        For i As Integer = 0 To level-1
            If ls(i) = s Then
                iscontains = True
                Exit For
            End If
        Next
        If iscontains Then Continue For
        If ls.count < level+1 Then
            ls.add(s)
        Else
            ls(level) = s
        End If
        functions.Execute("loop", drs, ls, level+1)
    Next
End If

 

调用代码

 

Dim dt As DataTable = DataTables("表A")
Dim drs = dt.Select("第二列 is not null")
Dim ls As new List(Of String)
Functions.Execute("loop", drs, ls, 0)


 回到顶部
帅哥哟,离线,有人找我吗?
一笑
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2018/2/24 11:00:00 [只看该作者]

能给每个字符串前加个序号(多少种可能性)吗?谢谢

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/2/24 11:23:00 [只看该作者]

函数:
Dim drs = args(0)
Dim ls = args(1)
Dim level = args(2)
If level = drs.count Then
    output.show(vars("idx") & " - " & String.Join("|", ls.ToArray))
    vars("idx") += 1
Else
    For Each s As String In drs(level)("第二列").split(",")
        Dim iscontains = False
        For i As Integer = 0 To level-1
            If ls(i) = s Then
                iscontains = True
                Exit For
            End If
        Next
        If iscontains Then Continue For
        If ls.count < level+1 Then
            ls.add(s)
        Else
            ls(level) = s
        End If
        functions.Execute("loop", drs, ls, level+1)
    Next
End If

调用

Dim dt As DataTable = DataTables("表A")
Dim drs = dt.Select("第二列 is not null")
Dim ls As new List(Of String)
vars("idx") = 1
Functions.Execute("loop", drs, ls, 0)

 回到顶部
帅哥哟,离线,有人找我吗?
一笑
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2018/2/24 18:44:00 [只看该作者]

代码运行正常,但计算量太大,层数稍多,系统就崩溃。想在找到一种可能性时就退出循环,如对结果不满意,再次启动,接着寻找下一种结果,求代码,谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/25 9:39:00 [只看该作者]

以下是引用一笑在2018/2/24 18:44:00的发言:
代码运行正常,但计算量太大,层数稍多,系统就崩溃。想在找到一种可能性时就退出循环,如对结果不满意,再次启动,接着寻找下一种结果,求代码,谢谢

 

你做个例子上来测试吧。

 

你可以做一个按钮,终止程序的。按钮代码

 

vars("结束") = true

 

然后其余代码改一下

 

Dim drs = args(0)
Dim ls = args(1)
Dim level = args(2)
Application.doevents
If vars("结束") Then Return Nothing
If level = drs.count Then
    output.show(vars("idx") & " - " & String.Join("|", ls.ToArray))
    vars("idx") += 1
Else
    For Each s As String In drs(level)("第二列").split(",")
        Application.doevents
        If vars("结束") Then Return Nothing
        Dim iscontains = False
        For i As Integer = 0 To level-1
            If ls(i) = s Then
                iscontains = True
                Exit For
            End If
        Next
        If iscontains Then Continue For
        If ls.count < level+1 Then
            ls.add(s)
        Else
            ls(level) = s
        End If
        functions.Execute("loop", drs, ls, level+1)
    Next
End If

 


调用

Dim dt As DataTable = DataTables("表A")
Dim drs = dt.Select("第二列 is not null")
Dim ls As new List(Of String)
vars("idx") = 1

vars("结束") = false

Functions.Execute("loop", drs, ls, 0)

 

[此贴子已经被作者于2018/2/25 10:02:38编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
小马甲
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:83 积分:733 威望:0 精华:0 注册:2016/12/2 15:17:00
  发帖心情 Post By:2018/2/25 9:57:00 [只看该作者]

6+1    ?

 回到顶部
帅哥哟,离线,有人找我吗?
一笑
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2018/2/25 12:08:00 [只看该作者]

代码可运行,但有以下问题:
1. 和设计思路不一样,需要每找到一种可能性就停止,点击“继续”,按钮再寻找下一种可能性。
请指教,谢谢
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:排班测试.zip


[此贴子已经被作者于2018/2/25 22:46:04编辑过]

 回到顶部
总数 24 1 2 3 下一页