I have to create a program that finds all the possible ways of filling a square of size x by y. You place a block which takes up 2 spaces to completely fill.
The problem is I don’t know how to code it to the point where you can remember the placements of each square. I can get it to where it fills the board completely once and maybe twice, but nothing past that. I also know that I’m supposed to use recursion to figure this out . Here is the code I started on so far. There is also a main method and I have the initial even/odd check working fine. This is the part I have no idea on.
public void recurDomino(int row, int column) {
if (Board[2][x - 1] != false) {
} else if(Board[1][x-1]!=false)
{
}
else {
for (int n=0; n < x - 1; n++) {
Board[row][column] = true;
Board[row][column+1] = true;
column++;
counter++;
}
recurDomino(1, 0);
recurDomino(2, 0);
}
}
Thank you for any help you guys can give me.
******************* EDIT ****************************************
I am a little confused still. I came up with this algorithm but I always get 2 for any value greater or equal to 2.
public boolean tryHorizontal(int row , int col){
if( row < 0 || row >= array[0].length-1)
return false;
else
return true;
}
public boolean tryVertical(int row, int col){
if( col < 0 || col >= 2 )
return false;
else
return true;
}
public boolean tryRowCol(int row, int col){
if(this.tryHorizontal(row, col) && this.tryVertical(row, col)){
return true;
}
else
return false;
}
public int findWays(int row, int col){
int n = 0;
if( !this.tryRowCol(row, col))
return 0;
else
n =+ 1 + this.findWays(row+1, col+1);
return n;
}
This recursive solution actually generates all the possible tiling of a general MxN board. It’s more general than what your program requires, and therefore not optimized to just count the number of tiling of a 3xN board.
If you just want to count how many there are, you can use dynamic programming techniques and do this much faster. Also, having the number of rows fixed at 3 actually makes the problem considerably easier. Nonetheless, this general generative solution should be instructive.
So here’s the meat and potatoes:
This excerpt from the last few lines of the output gives an example of a generated board, and the final count.
Note that 6728 checks out with OEIS A004003.
A few things that you need to learn from this solutions are:
So hopefully you can learn something from this and adapt the techniques for your homework. Good luck!
Tip: if you comment out the
printBoardline, you can generate all ~13 million boards for 8×8 in reasonable time. It’ll definitely be much faster to just compute the number without having to generate and count them one by one, though.Update!
Here’s a recursive generator for 3xN boards. It doesn’t use a shared mutable array, it just uses immutable strings instead. It makes the logic simpler (no clean up since you didn’t make a mess!) and the code more readable (where and how the pieces are placed is visible!).
Since we’re fixed at 3 rows, the logic is more explicit if we just have 3 mutually recursive functions.
You don’t often see 3 mutually recursive functions like this, so this should be educational.