编程语言
首页 > 编程语言> > python – Tiling,在这种情况下如何使用递归?

python – Tiling,在这种情况下如何使用递归?

作者:互联网

我正在尝试制作一个能够在拼贴问题中解决大型拼贴的算法.现在,它能够根据宽度和高度找到正确的瓷砖,但是在正确递归方面存在一些问题.

正如您所看到的那样,这个想法是在放置的每个瓷砖之后,该字段将在Field Right和Field Below中分开.该算法将首先尝试填充Field Right,并且一旦完成,它必须开始尝试填充Field Below.

我遇到的问题是,一旦Field Right得到解决,它必须以某种方式“回送”(我认为使用递归,虽然这很复杂)让它回到Tile并转到属于下面的字段到那个瓷砖.我把这个想法放在一些伪代码中让它更容易理解.

正如您所看到的,当FieldRightWidth被解决并且FieldBelowHeight也被解决时,我想让它返回到前一个tile以检查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

以及我想要算法做的图片:
enter image description here

以及所有代码:
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矢量,以防我在2D笛卡尔坐标中解释什么是矢量:
enter image description here
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}}

具有每个框的优先级和空格,看起来像背包问题算法.
如果您熟悉背包问题算法,我们会在表格中找到最优先填充空间的优先级,或者换句话说,最好的方式是拟合框.检查这个link1link2.

然而,背包问题算法的图表是1D解决方案,如果你这样做,你将得到10,所以Box1和Box2.但由于它是2D并且你有不同的高度和宽度,所以标准的1D公式不会起作用,也许你需要查看它,看看你是否可以提出2D公式或询问周围是否有人这样做过.

enter image description here
enter image description here

除了背包问题算法之外,您可以尝试使用Flood填充算法,如果你有很大的区域,它会慢一点,但它的工作方式就像俄罗斯方块游戏一样.

您需要设置标准大小,如1×1,然后用1×1数据定义整个区域,并将其存储在变量中并设置每个True(布尔值),然后使用更高优先级的框填充区域并将这些1×1日期设置为False,然后你可以很容易地检查它们中有多少是真的以及它们采取的是什么区域.

无论如何,我试图找出不规则形状的同样的东西,所以我发现了所有,希望能帮到你.
(检查这个link,我得到了一些有用的答案.)

编辑:好吧,如果你使用俄罗斯方块的想法在一个轴上定义区域和背包问题算法然后基于标准的俄罗斯方块区域,再使用背包问题算法在其他轴上应该完美地工作.

标签:python,algorithm,python-2-7,recursion,tiling
来源: https://codeday.me/bug/20190702/1355971.html