Office中国论坛/Access中国论坛

标题: 编程题目(空瓶分酒) [打印本页]

作者: Trynew    时间: 2005-11-3 18:53
标题: 编程题目(空瓶分酒)
1、某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中倒出6品脱。但是他没有6品脱的容器,只有一个8品脱的容器和一个5品脱的容器。怎样的倒法才能使8品脱的容器中恰好装好了6品脱啤酒?

一种解法:

12 8 5

12 0 0

4 8 0

4 3 5

9 3 0

9 0 3

1 8 3

1 6 5

6 6 0



2、一个桶装满10斤油,另外有一个能装3斤油的空桶和一个能装7斤油的空桶。试用这三个桶把10斤油平分为两份。
作者: 海狸先生    时间: 2005-11-4 03:41
第1个

Public Function fj()

Dim intGet(1, 2) As Integer, i As Integer, j As Integer, tmp As Integer

intGet(0, 0) = 12: intGet(1, 0) = 12

intGet(0, 1) = 8: intGet(1, 1) = 0

intGet(0, 2) = 5: intGet(1, 2) = 0

Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Do Until intGet(1, 1) = 6

   For i = 0 To 2

      If intGet(1, (i + 1) Mod 3) = 0 Then j = i: Exit For

   Next

   i = j

   j = (i + 1) Mod 3

   tmp = intGet(1, i) + intGet(1, j)

   intGet(1, j) = IIf(intGet(0, j) < tmp, intGet(0, j), tmp)

   intGet(1, i) = IIf(intGet(0, j) < tmp, tmp - intGet(0, j), 0)

   Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Loop

End Function

[此贴子已经被作者于2005-11-4 9:16:03编辑过]


作者: 海狸先生    时间: 2005-11-4 03:46
第二个的和第一个是一模一样的,就不写了
作者: ganrong    时间: 2005-11-6 02:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: LucasLynn    时间: 2005-11-10 17:36
以下是引用海狸先生在2005-11-3 19:41:00的发言:



第1个

Public Function fj()

Dim intGet(1, 2) As Integer, i As Integer, j As Integer, tmp As Integer

intGet(0, 0) = 12: intGet(1, 0) = 12

intGet(0, 1) = 8: intGet(1, 1) = 0

intGet(0, 2) = 5: intGet(1, 2) = 0

Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Do Until intGet(1, 1) = 6

   For i = 0 To 2

      If intGet(1, (i + 1) Mod 3) = 0 Then j = i: Exit For

   Next

   i = j

   j = (i + 1) Mod 3

   tmp = intGet(1, i) + intGet(1, j)

   intGet(1, j) = IIf(intGet(0, j) < tmp, intGet(0, j), tmp)

   intGet(1, i) = IIf(intGet(0, j) < tmp, tmp - intGet(0, j), 0)

   Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Loop

End Function





方法很不错,如果能采用双向同时遍历,速度会更快。
作者: Trynew    时间: 2005-11-11 20:18
Option ExplicitDim answ As String

Const a1 = 9999, b1 = 9, c1 = 7, d = 4Public Sub test()

answ = ""

Call fj

Debug.Print "The Best step is:" & answ

End SubPublic Function fj(Optional str As String, Optional a As Integer, Optional b As Integer, Optional c As Integer) As String

If a = 0 And b = 0 And c = 0 Then a = a1

If a = d Or b = d Or c = d Then

    If answ = "" Or Len(Mid(str, 2) & vbNewLine & a & " " & b & " " & c) < Len(answ) Then answ = Mid(str, 2) & vbNewLine & a & " " & b & " " & c

    'Debug.Print Mid(str, 2) & vbNewLine & a & " " & b & " " & c

Else

    If InStr(1, str, a & " " & b & " " & c) = 0 Then

        If a > 0 And b < b1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - b1 + b > 0, a - b1 + b, 0), IIf(a - b1 + b > 0, b1, a + b), c

        If b > 0 And a < a1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - a1 + b > 0, a1, a + b), IIf(a + b > a1, a - a1 + b, 0), c

        If a > 0 And c < c1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a + c > c1, a - c1 + c, 0), b, IIf(a - c1 + c > 0, c1, a + c)

        If c > 0 And a < a1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - a1 + c > 0, a1, a + c), b, IIf(a + c > a1, a - a1 + c, 0)

        If b > 0 And c < c1 Then fj str & vbNewLine & a & " " & b & " " & c, a, IIf(b - c1 + c > 0, b - c1 + c, 0), IIf(b - c1 + c > 0, c1, b + c)

        If c > 0 And b < b1 Then fj str & vbNewLine & a & " " & b & " " & c, a, IIf(b - b1 + c > 0, b1, b + c), IIf(b - b1 + c > 0, b - b1 + c, 0)

    End If

End If

End Function‘以上的题目可以表述为:容积分别为a1,a2,a3的容器分别装有a,b,c数量的液体,只能通过互相倒满或者倒空一个容器,用最少步数得到指定的数量:d。’如果a1远大于b1和c1,则可以理解为a1是一个池塘或一个大酒缸。以上程序可以描述为:用9斤和7斤的量筒一次得到4斤的酒。
作者: 海狸先生    时间: 2005-11-11 23:20
思路是a  b c d     a为需要分的容器,b和c是用来分的容器 ,b要大于c   ,d为指定数量先将 a 倒到b中,然后b到c中,c到a中,反复循环,直至条件满足,如果过程中出现有0,则从0的左边开始循环这个是最少的步骤
作者: jianbamail    时间: 2005-11-25 05:30
8错
作者: zhf130    时间: 2005-12-20 06:40
顶啊,真是不错
作者: oyljl    时间: 2006-3-11 06:32
[em02]
作者: oyljl    时间: 2006-3-11 06:33
[em02]
作者: J-2006    时间: 2006-3-30 04:50
[em06]




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3