- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试制作一种能够解决拼贴问题中的大图 block 集的算法。现在它能够根据宽度和高度找到正确的 Tiles 来放置,但是在使其正确递归方面存在一些问题。
如您所见,这个想法是,在放置的每个图 block 之后,该字段将被分隔为右字段和下字段。该算法将首先尝试填充右侧的字段,一旦完成,它就必须开始尝试填充下方的字段。
我遇到的问题是,一旦 Field Right 被解决,它必须以某种方式“发回”(我认为使用递归,虽然这很复杂)让它返回一个 Tile 并转到 Field下面属于那个 Tile。我把这个想法放在一些伪代码中,让它更容易理解。
如您所见,当 FieldRightWidth 已解决且 FieldBelowHeight 也已解决时,我想让它返回到前一个图 block 以检查 FieldBelow 是否已解决。我认为那是我需要放置一些代码来完成这项工作的地方,但经过数小时的谷歌搜索后,我仍然一无所知。
伪代码:
def Methods:
create global tileset
create local tileset (without duplicates)
If globaltiles is empty:
solved
end
else:
if fieldRightWidth == solved:
if fieldBelowHeight == solved:
return True???
#FIELD BELOW
else:
Search for Tile
Place Tile
Return Methods
#FIELD RIGHT
else:
Search for Tile
Place Tile
Return Methods
所有代码: http://pastebin.com/8t4PeiZP
http://www.filedropper.com/tilingnew
我在编码方面还是个新手,所以非常感谢任何建议或帮助!
最佳答案
好吧,假设您要计算的区域是正方形或矩形(未旋转),它从最小值 [x,y] 开始到最大值 [x,y] 结束,就像这样:
SMaxX = 5
SMinX = 0
SMaxY = 5
SMinY = 0
或者如果您熟悉 2D 矢量,您可以像这样优化它:
S = [5,5]
你可能知道 2D 向量,以防万一我解释什么是二维笛卡尔坐标中的向量:
S = [5,5]
表示,如果S
从[0,0]
开始,它将在[5, 5]
,(更简单吧?)
所以盒子也会像这样:
#space each box taking
box1 = [3,3]
box2 = [2,2]
box3 = [1,1]
并且由于每个框都有优先级,所以我们说:
#priority of each box
box1 = 6
box2 = 4
box3 = 2
我们可以像这样将空间和优先级合并到字典中:
#Items
dic = {'box1':{'space':[3,3] , 'priority ':6},
'box2':{'space':[2,2] , 'priority ':4},
'box3':{'space':[1,1] , 'priority ':2}}
有每个盒子的优先级和空间,看起来像背包问题算法。
如果您熟悉背包问题算法,我们会在表格中尝试找到能够完美填充空间的最高优先级,或者换句话说,就是最佳可能的装箱方式。检查这个link1和 link2 .
但是背包问题算法的图表是一维解,如果你这样做,你会得到 10,所以 Box1 和 Box2。但由于它是 2D 并且你有不同的高度和宽度,所以标准的 1D 公式不起作用,也许你需要研究它看看你是否可以想出 2D 公式或询问周围是否有人这样做过。
除了背包问题算法,你可以尝试洪水填充算法,如果你有很大的面积,它会有点慢,但它的工作原理就像俄罗斯方 block 游戏一样。
您需要设置标准大小,如 1x1,然后用 1x1 数据定义整个区域,并将其存储在变量中并设置每个 True( bool 值),然后用更高优先级的框填充该区域并设置这些 1x1 日期到 False,然后您可以很容易地检查它们中有多少是 True 以及它们占用的区域。
无论如何,我正在尝试找出不规则形状的相同事物,所以这就是我发现的全部内容,希望对您有所帮助。
(也检查这个 link,我得到了一些有用的答案。)
编辑: 好吧,如果你使用俄罗斯方 block 的想法在一个轴上定义区域和背包问题算法然后基于标准俄罗斯方 block 区域,在其他轴上再次使用背包问题算法应该可以完美地工作。
关于python - 平铺,在这种情况下如何使用递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011324/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!