我正在研究这几天,最后决定在这里发布我的问题。我会详细解释你在做什么以及如何做。 继续之前。我浏览了维基百科和另外20个网站来解释这个问题,但它没有帮助我。
其中一个更有用的网站:( Kanoodle)但是当我遇到问题时,解释非常糟糕。
问题:有多少种方法可以用W-,I-和L-五角星覆盖一个5xn的矩形。您可以翻转和旋转它们。您可能会问什么是Pentominos? Pentominos由5个方块组成,共同构成一个人物。例如W-Pentomino。
| A | B | C
---------------
a | 1 | 0 | 0 |
-------------
b | 1 | 1 | 0 | Imagine all the 1s together they build a big "W".
------------- If you look at my picture it will be clearer.
c | 0 | 1 | 1 |
我没有在5xn字段中实现W-,L-和I-Pentominos,而是开始考虑在5x3字段中填写“W”的所有可能方法。 像这样。 我的下一步是考虑一个类似于DLX-Knuth算法的矩阵,我想出了这个。黄色和橙色之间的绿线表示您可以将两者放在一起以获得另一个有效的解决方案。我的下一篇文章描述了这条绿线。
我注意到,如果我连续一行并检查此行下方或上方的任何其他行是否在同一列中没有1我有一个有效的解决方案。但我不知道如何实现它。在研究了几个小时后,我发现了另一种描述我的问题的方法。我拿了一个子集(我的W-Pentomino)并将其定义为这样。
然而,我再次无法实现这一点。
所以这是我的问题:你如何在JAVA中实现这个问题。我的做法好吗?你能用我的想法吗?如果是的话,你会怎样继续,如果不是,你会告诉我在我的想法中失败了吗?
这是我写的sofar代码。
package data;
public class PentominoWILDLX
{
static Node h; // header element
static int cnt; // count solutions
public PentominoWILDLX()
{
h = new Node(); // init header element
cnt = 0; // init counter
}
public static void search (int k) // finds & counts solutions
{
if(h.R == h) // if empty: count & done
{
cnt++; return; // choose next column c
}
Node c = h.R; // remove c from clumns
cover(c); // choose next colun c
for (Node r=c.D; r!=c; r=r.D) // forall rows with 1 in c
{
for(Node j=r.R; j!=r; j=j.R) // forall 1-elements in row
{
cover(j.C); // remove clumn
}
search(k+1); // recursion with k+1 << hier überpfüen ob ich ändern muss
for (Node j=r.L; j!=r; j=j.L) // forall 1-elemnts in row
{
uncover(j.C); // backtrack . unremove? << googlen
}
uncover(c); // unremove f c to coulmns
}
}
public static void cover (Node c) // remove clumn c
{
c.R.L = c.L; // remove header
c.L.R = c.R; // from row list
for (Node i=c.D; i!=c; i=i.D) // forall rows with 1
{
for (Node j=i.R; i!=j; j=j.R) // forall elem in row
{
j.D.U = j.U; // rmove row elemnt
j.U.D = j.D; // from column list
}
}
}
public static void uncover (Node c) // undo remove col c
{
for (Node i=c.U; i!=c; i=i.U) // forall rows with 1
{
for (Node j=i.L; i!=j; j=j.L) // for all elem in row
{
j.D.U = j; // unremove row ele,
j.U.D = j; // to lumn list
}
c.R.L = c; // unremove header
c.L.R = c; // to row list
}
} // end of class
class Node // represents 1 element or header
{
Node C; // reference to column-header << h?,
Node L; // left
Node R; // right
Node U; // reference up
Node D; // down reference down
Node()
{
C=L=R=U=D=this; // 2*double-linked circular list
}
} // end of class
public static void main(String[] args)
{
}
}
答案 0 :(得分:2)
要找到可以将Pentomino放入矩形的所有可能方法,您可以执行以下步骤:
以下是我用来解决这个问题的一些工作照片:
寻找可能性:
旋转(正方形和矩形):
翻转: