谁能建议如何使用计算机程序解决Log Pile木制拼图?
请参阅此处以查看拼图:http://www.puzzlethis.co.uk/products/madcow/the_log_pile.htm
图片只显示了一些部分.全套10件配置如下,其中1代表一个钉,-1代表一个孔,0代表一个钉和一个孔.
-1,1,0,-1,0
1,0,1,0,0
1,-1,1,0,0
-1,
-1,0,0 ,-1 -1,1,0,1 ,0
0,1,0,0,1
1,0,-1,0,-1
0,-1,0,1,0
0,0,-1,1,-1
1,0,-1, 0,0
这些部件可以互锁成两层,每层5件,顶层与底层成90度,如上面的链接所示.
我已经使用Java自己创建了这个问题的解决方案,但我觉得这是一个笨拙的解决方案,我有兴趣看到一些更复杂的解决方案.您可以随意提出一般方法或以您选择的语言提供工作计划.
我的方法是使用上面的数字表示法来创建一个"日志"数组.然后我使用组合/置换生成器来尝试所有可能的Logs排列,直到找到所有交叉点等于零的解(即Peg to Hole,Hole to Peg或Blank to Blank).我使用了一些加速来检测给定排列的第一个失败的交叉点并继续下一个排列.
我希望你发现这和我一样有趣.
谢谢,克雷格.
使用Ruby 1.9.2在Mac OS X上运行Rails 3.0.7
我有三个模型,后面有表格(sqlite3表示dev,postgres表示prod).它们如下(验证和其他不相关的行被截断):
class ServiceProvider < ActiveRecord::Base
has_many :services
has_many :advertisements, :through => :services
scope :active, where("service_providers.active = ?", true)
end
class Service < ActiveRecord::Base
belongs_to :service_provider
has_many :advertisements
scope :active, joins(:service_provider).where("services.active = ?", true) & ServiceProvider.active
end
class Advertisement < ActiveRecord::Base
belongs_to :service
scope :ranked, where("advertisements.rank > 0")
scope :current, where("start_date <= ? AND end_date >= ?", Date.today, Date.today)
scope :service_active, joins(:service) & Service.active
scope :active, ranked.current.service_active
end
Run Code Online (Sandbox Code Playgroud)
如您所见,每个服务提供商都有许多服务,每个服务都可以有很多广告.广告表中包含service_id外键,services表中包含service_provider_id外键.所有相当标准的多对一关系.可以通过"活动"标志使服务提供者处于非活动状态,就像个别服务一样.
我想要做的是在广告模型上创建一个命名范围,以便为我提供所有广告的列表,这些广告是排名和当前以及谁的父服务是活动的,反过来谁的service_provider是活动的.换句话说,如果服务变为非活动状态,那么指向它的所有广告应该变为非活动状态,如果服务提供者变为非活动状态,则所有服务,以及这些服务下的所有广告应该变为非活动状态.
我已经开始创建上面所需的命名范围,它在Service.active和ServiceProvider.active级别按预期工作,但如果我输入Advertisement.active,我会收到一个错误:
ActiveRecord::ConfigurationError: Association named 'service_provider' was …Run Code Online (Sandbox Code Playgroud)