游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3649|回复: 12

询问:经典的中学算法竞赛试题

[复制链接]

23

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
发表于 2008-6-13 10:12:00 | 显示全部楼层 |阅读模式
    有三个没有刻度的桶,容量分别为3升、5升、8升。现在8升的桶是满的,你可以将水在桶中倒来倒去。例如,首先8->3,那么8升桶内将会有5升水,3升桶会被装满;然后3->5,那么3升桶将被倒空,5升桶内将有3升水。你的目标是平分这8升水,即使5升桶和8升桶内均有4升水。
    本人使用遍历树,但是速度不是最好.
    高手给出代码(直接贴关键代码即可,不需要示例),速度越快越好.貌似使用深度优先搜索可以搞定.

17

主题

141

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2008-6-13 11:56:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

这种东西真接算还行,编程就不会了

1

主题

102

帖子

108

积分

注册会员

Rank: 2

积分
108
QQ
发表于 2008-6-13 13:21:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

我写了个BFS,主要是怕无限搜索下去……
这个结果包含最少步数,
如果数据就是这三个桶的话还很好,多了的话队列就满了……所以lz看看能不能剪枝,加上个(已经有了一个就是目标桶不满)
    Dim av As Integer() = New Integer() {8, 5, 3}

    Structure state
        Public v As Integer()

        Public depth As Integer

        Public Sub New(ByRef s As state)
            v = New Integer(2) {}
            v(0) = s.v(0)
            v(1) = s.v(1)
            v(2) = s.v(2)
            depth = s.depth + 1
        End Sub

        ''' <summary>
        ''' a向b中倒
        ''' </summary>
        Public Function p(ByVal a As Integer, ByVal b As Integer) As Boolean
            Dim m As Integer = av(b) - v(b)

            If m > v(a) Then
                m = v(a)
            End If

            v(a) -= m
            v(b) += m

            Return m > 0
        End Function
    End Structure

    Function check(ByRef s As state) As Boolean
        Return (s.v(0) = 4 And s.v(1) = 4) Or (s.v(0) = 3 And s.v(1) = 3 And s.v(2) = 3)
    End Function

    Sub Main()
        Dim q As New Queue(Of state)(100000)

        Dim s1 As state
        s1.v = New Integer(2) {}
        s1.v(0) = 8
        s1.v(1) = 0
        s1.v(2) = 0

        q.Enqueue(s1)

        Dim found As Boolean
        While (q.Count > 0 And Not found)
            Dim cs As state = q.Dequeue

            If check(cs) Then
                Console.WriteLine(cs.v(0))
                Console.WriteLine(cs.v(1))
                Console.WriteLine(cs.v(2))
                Console.WriteLine(cs.depth.ToString + "步")
                found = True
            Else
                For i As Integer = 0 To 2
                    For j As Integer = 0 To 2
                        Dim ns As New state(cs)

                        If ns.p(i, j) Then

                            q.Enqueue(ns)
                        End If
                    Next
                Next
            End If
        End While
        Console.ReadKey()
    End Sub

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2008-6-13 16:46:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

雷顿教授与XXXXX里经常见到。

3

主题

322

帖子

334

积分

中级会员

Rank: 3Rank: 3

积分
334
发表于 2008-6-18 16:25:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

代码懒得写了.在纸上画了几次...就说说思想算了.
先写几个倒水过程(X倒Y,Z;Y倒X,Z)
再写个检测过程
到水前,倒水源为空;倒水后,检测是否与之前作过的步骤重复;倒的目标为满,的步骤都不列入成功步骤.不继续往下分步.

弄2个数组.
基本过程的结果:

瓶(100)    步骤(100)
008         A
305         AA
053         AB
350         AAA
035         AAB
323         ABA
332         AABA
026         ABAA
152         AABAA
206         ABAAA
107         AABAAA
251         ABAAAA
017         AABAAAA
341         ABAAAAA
314         AABAAAAA
044         ABAAAAAA
044         AABAAAAAA


再写个过程.取得

最块为7步
008     A
053     AB
323     ABA
026     ABAA
206     ABAAA
251     ABAAAA
341     ABAAAAA
044     ABAAAAAA

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2008-6-18 17:59:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

这题目要求没给完吧,一般都会有加“最少次数”或者“所有遍历”之类的限制吧,不然不好judge啊。

这种题一般都是搜索吧,产生式系统,初始和目标状态都很确定。
是我一般就上BFS了,只要数据规模不是很大时空复杂度完全可以接受。

1

主题

102

帖子

108

积分

注册会员

Rank: 2

积分
108
QQ
发表于 2008-6-19 01:50:00 | 显示全部楼层

Re:询问:经典的中学算法竞赛试题

en,一样,是7步。
不过5楼一提醒后,我才发现竟然忘建个表判重了……否则,这点数据队列最多时能有20000多个元素。。。

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2008-6-19 12:33:00 | 显示全部楼层

Re: Re:询问:经典的中学算法竞赛试题

Miu.C: Re:询问:经典的中学算法竞赛试题

雷顿教授与XXXXX里经常见到。


雷顿教授是什么东西

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2008-6-19 20:08:00 | 显示全部楼层

Re: Re: Re:询问:经典的中学算法竞赛试题

游戏之家站长: Re: Re:询问:经典的中学算法竞赛试题



雷顿教授是什么东西

Google & Baidu

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-6-20 12:42:00 | 显示全部楼层

Re: Re: Re: Re:询问:经典的中学算法竞赛试题

Miu.C: Re: Re: Re:询问:经典的中学算法竞赛试题


Google & Baidu

又来,你以为它是无敌的啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 05:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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