本帖最后由 老刘1号 于 2019-3-15 08:34 编辑
某算法课程中看到的一个题,
一个人带三只狼和三只羚羊过河,只有一条船,同船可以容纳一个人和两只动物。没有人在的时候,如果狼的数量不少于羚羊的数量,狼就会吃掉羚羊。请编程求过河方案。
据说练回溯很好,欢迎大家回帖分享自己的代码
vbs版(无效率可言,仅为粗略实现)- Rem Code By 老刘
- todo=Array("[人去对岸]","[人回该岸]","[带1狼去对岸]","[带2狼去对岸]","[带1狼回该岸]","[带2狼回该岸]","[带1羊去对岸]","[带2羊去对岸]","[带1羊回该岸]","[带2羊回该岸]","[带狼羊去对岸]","[带狼羊回该岸]")
- Dim [方法]
- [方法] = 1
- recursion New [三狼三羊过河问题],"3,0,3,0,1",""
-
-
- Sub recursion(ByRef obj,ByVal StatusLog,byVal StepLog)
- Dim nowStatus
- nowStatus = Join(obj.[当前情形],",")
- If nowStatus = "0,3,0,3,2" Then
- wsh.echo "方法"&[方法]&StepLog&vbNewLine
- [方法] = [方法] + 1
- Else
- For i = 0 To UBound(todo)
- If Eval("obj."&todo(i)) = True Then
- If InStr(StatusLog,Join(obj.[当前情形],",")) = 0 Then '避免执行步骤恢复到以前状态,陷入死循环
- recursion obj,StatusLog & vbNewLine & Join(obj.[当前情形],","),StepLog & vbNewLine & todo(i)
- End If
- End If
- Execute "obj.[加载情形] " & nowStatus
- Next
- End If
- End Sub
-
- Class [三狼三羊过河问题]
- Private [该岸羊数],[对岸羊数],[该岸狼数],[对岸狼数],[人的位置]
-
- Private Sub Class_Initialize
- [该岸羊数] = 3
- [对岸羊数] = 0
- [该岸狼数] = 3
- [对岸狼数] = 0
- [人的位置] = 1 '表示该岸,2为对岸
- End Sub
-
- Public Sub [加载情形](a,b,c,d,e)
- [该岸羊数] = a
- [对岸羊数] = b
- [该岸狼数] = c
- [对岸狼数] = d
- [人的位置] = e
- End Sub
-
- Public Function [当前情形]
- [当前情形] = Array([该岸羊数],[对岸羊数],[该岸狼数],[对岸狼数],[人的位置])
- End Function
-
- Private Function [可行性分析]
- If [人的位置] = 1 Then '人在该岸
- If [对岸狼数] >= [对岸羊数] And [对岸羊数] >= 1 Then
- [可行性分析] = False '对岸狼会吃羊
- Else
- [可行性分析] = True
- End If
- Else '人在对岸
- If [该岸狼数] >= [该岸羊数] And [该岸羊数] >= 1 Then
- [可行性分析] = False '该岸狼会吃羊
- Else
- [可行性分析] = True
- End If
- End If
- End Function
-
- Public Function [人去对岸]
- If [人的位置] = 2 Then
- [人去对岸] = False
- Else
- [人的位置] = 2
- If [可行性分析] = False Then
- [人的位置] = 1
- [人去对岸] = False '操作不可行
- Else
- [人去对岸] = True '操作可行
- End If
- End If
- End Function
-
- Public Function [人回该岸]
- If [人的位置] = 1 Then
- [人回该岸] = False
- Else
- [人的位置] = 1
- If [可行性分析] = False Then
- [人的位置] = 2
- [人回该岸] = False '操作不可行
- Else
- [人回该岸] = True '操作可行
- End If
- End If
- End Function
-
- Public Function [带1狼去对岸]
- If [人的位置] = 2 Then
- [带1狼去对岸] = False
- Else
- If [该岸狼数] = 0 Then '该岸无狼
- [带1狼去对岸] = False
- Else
- [人的位置] = 2
- [该岸狼数] = [该岸狼数] - 1
- [对岸狼数] = [对岸狼数] + 1
- If [可行性分析] = False Then
- [带1狼去对岸] = False
- Else
- [带1狼去对岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带2狼去对岸]
- If [人的位置] = 2 Then
- [带2狼去对岸] = False
- Else
- If [该岸狼数] <= 1 Then '该岸狼不够
- [带2狼去对岸] = False
- Else
- [人的位置] = 2
- [该岸狼数] = [该岸狼数] - 2
- [对岸狼数] = [对岸狼数] + 2
- If [可行性分析] = False Then
- [带2狼去对岸] = False
- Else
- [带2狼去对岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带1狼回该岸]
- If [人的位置] = 1 Then
- [带1狼回该岸] = False
- Else
- If [对岸狼数] = 0 Then '对岸无狼
- [带1狼回该岸] = False
- Else
- [人的位置] = 1
- [该岸狼数] = [该岸狼数] + 1
- [对岸狼数] = [对岸狼数] - 1
- If [可行性分析] = False Then
- [带1狼回该岸] = False
- Else
- [带1狼回该岸] = True
- End If
- End If
- End If
-
- End Function
-
- Public Function [带2狼回该岸]
- If [人的位置] = 1 Then
- [带2狼回该岸] = False
- Else
- If [对岸狼数] <= 1 Then '对岸狼不够
- [带2狼回该岸] = False
- Else
- [人的位置] = 1
- [该岸狼数] = [该岸狼数] + 2
- [对岸狼数] = [对岸狼数] - 2
- If [可行性分析] = False Then
- [带2狼回该岸] = False
- Else
- [带2狼回该岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带1羊去对岸]
- If [人的位置] = 2 Then
- [带1羊去对岸] = False
- Else
- If [该岸羊数] = 0 Then '该岸无羊
- [带1羊去对岸] = False
- Else
- [人的位置] = 2
- [该岸羊数] = [该岸羊数] - 1
- [对岸羊数] = [对岸羊数] + 1
- If [可行性分析] = False Then
- [带1羊去对岸] = False
- Else
- [带1羊去对岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带2羊去对岸]
- If [人的位置] = 2 Then
- [带2羊去对岸] = False
- Else
- If [该岸羊数] <= 1 Then '该岸羊不够
- [带2羊去对岸] = False
- Else
- [人的位置] = 2
- [该岸羊数] = [该岸羊数] - 2
- [对岸羊数] = [对岸羊数] + 2
- If [可行性分析] = False Then
- [带2羊去对岸] = False
- Else
- [带2羊去对岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带1羊回该岸]
- If [人的位置] = 1 Then
- [带1羊回该岸] = False
- Else
- If [对岸羊数] = 0 Then '对岸无羊
- [带1羊回该岸] = False
- Else
- [人的位置] = 1
- [该岸羊数] = [该岸羊数] + 1
- [对岸羊数] = [对岸羊数] - 1
- If [可行性分析] = False Then
- [带1羊回该岸] = False
- Else
- [带1羊回该岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带2羊回该岸]
- If [人的位置] = 1 Then
- [带2羊回该岸] = False
- Else
- If [对岸羊数] <= 1 Then '对岸羊不够
- [带2羊回该岸] = False
- Else
- [人的位置] = 1
- [该岸羊数] = [该岸羊数] + 2
- [对岸羊数] = [对岸羊数] - 2
- If [可行性分析] = False Then
- [带2羊回该岸] = False
- Else
- [带2羊回该岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带狼羊去对岸]
- If [人的位置] = 2 Then
- [带狼羊去对岸] = False
- Else
- If [该岸羊数] = 0 Or [该岸狼数] = 0 Then
- [带狼羊去对岸] = False
- Else
- [人的位置] = 2
- [该岸羊数] = [该岸羊数] - 1
- [对岸羊数] = [对岸羊数] + 1
- [该岸狼数] = [该岸狼数] - 1
- [对岸狼数] = [对岸狼数] + 1
- If [可行性分析] = False Then
- [带狼羊去对岸] = False
- Else
- [带狼羊去对岸] = True
- End If
- End If
- End If
- End Function
-
- Public Function [带狼羊回该岸]
- If [人的位置] = 1 Then
- [带狼羊回该岸] = False
- Else
- If [对岸羊数] = 0 Or [对岸狼数] = 0 Then
- [带狼羊回该岸] = False
- Else
- [人的位置] = 1
- [该岸羊数] = [该岸羊数] + 1
- [对岸羊数] = [对岸羊数] - 1
- [该岸狼数] = [该岸狼数] + 1
- [对岸狼数] = [对岸狼数] - 1
- If [可行性分析] = False Then
- [带狼羊回该岸] = False
- Else
- [带狼羊回该岸] = True
- End If
- End If
- End If
- End Function
- End Class
复制代码 部分结果
方法1
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带2羊去对岸]
[带2狼回该岸]
[带1羊去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
方法2
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带2羊去对岸]
[带2狼回该岸]
[带1羊去对岸]
[人回该岸]
[带2狼去对岸]
方法3
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带2羊去对岸]
[带2狼回该岸]
[带1羊去对岸]
[带1狼回该岸]
[带2狼去对岸]
[人回该岸]
[带1狼去对岸]
方法4
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带1狼去对岸]
[人回该岸]
[带2羊去对岸]
[带2狼回该岸]
[带1羊去对岸]
[带1狼回该岸]
[带2狼去对岸]
[带1狼回该岸]
[带2狼去对岸]
...
方法260
[带2狼去对岸]
[带1狼回该岸]
[带狼羊去对岸]
[带1羊回该岸]
[带狼羊去对岸]
[带1羊回该岸]
[带2羊去对岸]
[带2狼回该岸]
[带狼羊去对岸]
[带2狼回该岸]
[带1狼去对岸]
[人回该岸]
[带2狼去对岸] |