特殊的矩形矩形平铺

假设我们有一个边长为S的正方形,并且有长度为X和宽度为Y的矩形块的N个副本。程序必须显示所有这些副本可以排列在网格中的方式,以便两个副本不能相互接触

通过显示,我的意思是它必须显示网格中每个副本左上角的一组坐标。

我试图按照以下方式做到这一点:

  • 找到一个基本案例,我尝试将每个副本放在1平方分隔中。 例如,对于6x6网格中的一个1x2图块的6个副本,基本情况为

    xx_xx_
    ______
    xx_xx_
    ______
    xx_xx_
    ______
    
  • 将最后一个瓷砖移到可能的位置。

  • 将最后一个图块返回到基本大小写,将最后一个图块之前的图块移动到可能的位置。 重复步骤2。

  • 为每块瓷砖做回来。

  • 基本上问题是,我找不到行或列号码差异为1但不相互接触的情况。 例如,我找不到这种情况:

    xx____  This tile
    ___xx_  and this one has a difference in row numbers 1.
    xx____
    ___xx_
    xx____
    ___xx_
    

    你能提出一些建议吗? 或者,也许更有效的算法?

    注:我尝试在Prolog中实现它。


    你会发现这个问题适用于约束编程(这与Prolog不太相似,你试图使用它):

  • 给定S,
  • 你需要一组对A = {(x,y)}其中x elem {1..S}和y elem {1..S},x和y表示你的图块的左上角,
  • (x,y)不在A中且(x + 2,y)不在A中且(x + 3,y)不在A中并且(x,y + 1)不在A ......更多的约束,这意味着如果你在(x,y)上有一个瓦片,没有瓦片在(x + 1,y)或(x + 2,y)或(x + 3,y)即它们不重叠并且不接触。
  • 美的是,通过上面你声明性地指定了问题,然后你最喜欢的约束求解器(我会去GECODE)去找到所有的解决方案。 如果你的规格没有完成,你会得到以意想不到的方式接触或重叠的瓷砖,你可以修改规格并且不必重新发明轮子。 这将适用于相当大的问题实例...当您可以添加巧妙的修剪搜索树的方法时,如果您需要大S的话,您只需开始创造聪明的算法。


    每次填充特定行时,您都可以为上一行使用位掩码 。 例如:

    如果前一行是这样的:

    XX----
    

    然后有一个像110000的位掩码。要填充下一行,请参阅您不使用位掩码中有1的位置。

    所以你可以这样做:

    for(int i=0;i<(1<<S);i++)
     if(i & bitmask)
     {
     //can't place tile in this fashion as few tiles of previous row touch this row's tiles
     continue;
     }
     else
     {
     //No conflicts between rows, but with in this row there could be touching tiles as in 111100
     //Use a for loop to check if the given row has no two tiles touching
     //Check if each string of 1's is of length X
     //If all is well recursively call this function to fill the next row using i as the bitmask
     }
    

    我会让你弄清楚实际的执行情况。

    链接地址: http://www.djcxy.com/p/40221.html

    上一篇: A particular tiling of a square with rectangles

    下一篇: Combinatorial Game. Who wins if both players play optimally