Coding 2: Recursive Grid Tiling
Grid Tiling
Here's an interesting theorem: consider a square grid of squares with sides
given by some power of (i.e. a grid of size 2^n \times 2^n) like this example
of a 2^3 \times 2^3 grid:
If you select exactly one grid square to remove (which is colored black below), then the remaining squares can be tiled by 3-square L-shape tiles, like this.
The proof of this fact is inductive and leads to a simple recursive algorithm
for producing a tiling. Assume that you can tile any 2^{n-1} \times 2^{n-1}
grid with a single square removed with L-shaped tiles. Suppose we are given a
2^n \times 2^n grid with one square removed.
Here's an example of what we've got:
How can we use our inductive hypothesis to show that the entire grid can be tiled? Well, let's start by splitting our grid vertically and horizontally in half:
Notice that this splits our 2^n \times 2^n sized grid into four
2^{n-1} \times 2^{n-1} sized sub-grids, and one of them (the top left in our
example above) already has a square removed but notice that three of them do
not yet have a square removed. This means we can use our inductive hypothesis
to tile whichever sub-grid contains the square we already wanted removed:
But now we're a bit stuck, because the conditions of the inductive hypothesis
apply if we have a 2^{n-1} \times 2^{n-1} grid with one square removed, but
instead we have three 2^{n-1} \times 2^{n-1} grids with no squares removed.
But now notice the following trick. We can place a single L-tile that covers
exactly one grid square in each of three sub-grids that we haven't yet tiled!
But notice that since this new L-tile covers exactly one square from each of the
three untiled sub-grids, we now have three 2^{n-1} \times 2^{n-1} each with a
single square removed and so the inductive hypothesis now applies! We can tile
each quadrant individually using the inductive hypothesis.
Then
Then
And finally, with the red dividing lines removed:
The base case for this induction are the 2x2 grids, which become L-tiles if we remove anyone grid square.
Your Task
You are going to write a program to compute L-tilings of 2^n \times 2^n square
grids. You will assign each tile a number starting with 00. The first tile you
generate should have all of its grid cells marked with a 00, the next tile 01,
etc.
Input
The first line of input will give the grid size parameter n as an integer. The second line will contain the index (i, j) of the removed tile.
Output
Your code should output 2^n lines, each containing 2^n 2-digit numbers
separated by spaces (and formatted so that single digit numbers have a leading
0). The value of each grid location should be the tile index you generated. (You
may assume you won't need 3 digits).
| Sample Input | Sample Output |
3 |
-1 02 03 03 07 07 08 08 02 02 01 03 07 06 06 08 04 01 01 05 09 09 06 10 04 04 05 05 00 09 10 10 12 12 13 00 00 17 18 18 12 11 13 13 17 17 16 18 14 11 11 15 19 16 16 20 14 14 15 15 19 19 20 20 |
3 |
02 02 03 03 07 07 08 08 02 01 -1 03 07 06 06 08 04 01 01 05 09 09 06 10 04 04 05 05 00 09 10 10 12 12 13 00 00 17 18 18 12 11 13 13 17 17 16 18 14 11 11 15 19 16 16 20 14 14 15 15 19 19 20 20 |
4 |
03 03 04 04 08 08 09 09 24 24 25 25 29 29 30 30 03 02 02 04 08 07 07 09 24 23 23 25 29 28 28 30 05 02 06 06 10 10 07 11 26 23 27 27 31 31 28 32 05 05 06 01 01 10 11 11 26 26 27 22 22 31 32 32 13 13 14 01 18 18 19 19 34 34 35 35 22 39 40 40 13 12 14 14 18 17 17 19 34 33 33 35 39 39 38 40 15 12 12 16 20 17 21 21 36 36 33 37 41 38 38 42 15 15 16 16 20 20 21 00 00 36 37 37 41 41 42 42 45 45 46 46 50 50 51 00 66 66 67 67 71 71 72 72 45 44 44 46 50 49 51 51 66 65 65 67 71 70 70 72 47 44 48 48 52 49 49 53 68 65 -1 69 73 73 70 74 47 47 48 43 52 52 53 53 68 68 69 69 64 73 74 74 55 55 56 43 43 60 61 61 76 76 77 64 64 81 82 82 55 54 56 56 60 60 59 61 76 75 77 77 81 81 80 82 57 54 54 58 62 59 59 63 78 75 75 79 83 80 80 84 57 57 58 58 62 62 63 63 78 78 79 79 83 83 84 84 |
Visualizing Your Results:
You can use the plot_tiles.py program to visualize your input. It will draw figures similar to the ones shown in this assignment and may help you debug your program if it has issues.
Program Grading and Submission
This assignment is to be submitted into Gradescope. Grading criterion is:
- 10 points for the example problems shown in the assignment
- 8 points on hidden example problems
- 2 points for style









