罐子难题问题,红宝石的初始配置和最终配置

时间:2019-05-18 10:24:40

标签: ruby

假设有3个最大容量的罐子,分别是8升,5升,3升。

初始配置为8升,0升,0升,最终配置为4升,4升,0升。

程序应产生一系列操作以从初始配置达到最终配置,如果没有路径,则返回一条消息。

您的程序应该能够计算出用户指定的任何初始和最终配置的步骤。

我完全困惑。 请给我任何建议..........

puzzle output

1 个答案:

答案 0 :(得分:1)

以下不是答案,而是扩展的注释。 (请不要投票。)

我假设传输是这样的,如果将Jar A的部分或全部内容传输到Jar B,则在传输完成后jar A将为空或jar B将已满。

这是一个开始(不是解决方案)。

class Jars
  attr_accessor :content
  attr_reader :capacity, :target

  def initialize(capacity, content, target)
    @capacity, @content, @target = capacity, content, target
  end

  def transfer_to(other_jar)
     if self.content <= other_jar.capacity - other_jar.content
       # jar self is emptied
       other_jar.content += self.content
       self.content = 0
     else
       # other_jar becomes full
       self.content -= other_jar.capacity - other_jar.content
       other_jar.content = other_jar.capacity
     end
  end
end

def success?(*jars)
  jars.all? { |jar| jar.content == jar.target }
end

jar8 = Jars.new(8, 8, 4)
  #=> #<Jars:0x000057c7edc841e8 @capacity=8, @content=8> 
jar5 = Jars.new(5, 0, 4)
  #=> #<Jars:0x000057c7ede176e0 @capacity=5, @content=0> 
jar3 = Jars.new(3, 0, 0)
  #=> #<Jars:0x000057c7ede422a0 @capacity=3, @content=0>

jar8.content #=> 8
jar5.content #=> 0
jar3.content #=> 0

success?(jar3, jar5, jar8) #=> false

jar8.transfer_to(jar3)
jar8.content #=> 5
jar5.content #=> 0
jar3.content #=> 3

success?(jar3, jar5, jar8) #=> false 

jar3.transfer_to(jar5)
jar8.content #=> 5
jar5.content #=> 3
jar3.content #=> 0

success?(jar3, jar5, jar8) #=> false 

,依此类推。您能否提出一种产生success?(jar3, jar5, jar8) #=> true的算法?