Pentomino tiling: Difference between revisions

(added shapes)
(→‎{{headerJava}}: added Java)
Line 34:
;Cf.
* [[Free_polyominoes_enumeration|Free polyominoes enumeration]]
 
=={{header|Java}}==
<lang java>import java.util.*;
 
public class PentominoTiling {
 
static final char[] symbols = "FILNPTUVWXYZ-".toCharArray();
static final Random rand = new Random();
 
static final int nRows = 8;
static final int nCols = 8;
static final int target = 12;
static final int blank = 12;
 
static int[][] grid = new int[nRows][nCols];
static boolean[] placed = new boolean[target];
 
public static void main(String[] args) {
 
for (int r = 0; r < nRows; r++)
Arrays.fill(grid[r], -1);
 
for (int i = 0; i < 4; i++)
grid[rand.nextInt(nRows)][rand.nextInt(nCols)] = blank;
 
if (solve(0, 0)) {
printResult();
} else {
System.out.println("no solution");
}
}
 
static void printResult() {
for (int[] r : grid) {
for (int i : r)
System.out.printf("%c ", symbols[i]);
System.out.println();
}
}
 
static boolean tryPlaceOrientation(int[] o, int r, int c, int shapeIdx) {
 
for (int i = 0; i < o.length; i += 2) {
 
if (r + o[i] < 0 || r + o[i] >= nRows || c + o[i + 1] < 0
|| c + o[i + 1] >= nCols
|| grid[r + o[i]][c + o[i + 1]] != -1)
return false;
}
 
grid[r][c] = shapeIdx;
for (int i = 0; i < o.length; i += 2)
grid[r + o[i]][c + o[i + 1]] = shapeIdx;
 
return true;
}
 
static void removeOrientation(int[] o, int r, int c) {
grid[r][c] = -1;
for (int i = 0; i < o.length; i += 2)
grid[r + o[i]][c + o[i + 1]] = -1;
}
 
static boolean solve(int pos, int numPlaced) {
if (numPlaced == target)
return true;
 
int row = pos / nCols;
int col = pos % nCols;
 
if (grid[row][col] != -1)
return solve(pos + 1, numPlaced);
 
for (int i = 0; i < shapes.length; i++) {
for (int[] orientation : shapes[i]) {
 
if (!placed[i]) {
 
if (!tryPlaceOrientation(orientation, row, col, i))
continue;
 
placed[i] = true;
 
if (solve(pos + 1, numPlaced + 1))
return true;
 
removeOrientation(orientation, row, col);
placed[i] = false;
}
}
}
return false;
}
 
static final int[][] F = {{1, -1, 1, 0, 1, 1, 2, 1}, {0, 1, 1, -1, 1, 0, 2, 0},
{1, 0, 1, 1, 1, 2, 2, 1}, {1, 0, 1, 1, 2, -1, 2, 0}, {1, -2, 1, -1, 1, 0, 2, -1},
{0, 1, 1, 1, 1, 2, 2, 1}, {1, -1, 1, 0, 1, 1, 2, -1}, {1, -1, 1, 0, 2, 0, 2, 1}};
 
static final int[][] I = {{0, 1, 0, 2, 0, 3, 0, 4}, {1, 0, 2, 0, 3, 0, 4, 0}};
 
static final int[][] L = {{1, 0, 1, 1, 1, 2, 1, 3}, {1, 0, 2, 0, 3, -1, 3, 0},
{0, 1, 0, 2, 0, 3, 1, 3}, {0, 1, 1, 0, 2, 0, 3, 0}, {0, 1, 1, 1, 2, 1, 3, 1},
{0, 1, 0, 2, 0, 3, 1, 0}, {1, 0, 2, 0, 3, 0, 3, 1}, {1, -3, 1, -2, 1, -1, 1, 0}};
 
static final int[][] N = {{0, 1, 1, -2, 1, -1, 1, 0}, {1, 0, 1, 1, 2, 1, 3, 1},
{0, 1, 0, 2, 1, -1, 1, 0}, {1, 0, 2, 0, 2, 1, 3, 1}, {0, 1, 1, 1, 1, 2, 1, 3},
{1, 0, 2, -1, 2, 0, 3, -1}, {0, 1, 0, 2, 1, 2, 1, 3}, {1, -1, 1, 0, 2, -1, 3, -1}};
 
static final int[][] P = {{0, 1, 1, 0, 1, 1, 2, 1}, {0, 1, 0, 2, 1, 0, 1, 1},
{1, 0, 1, 1, 2, 0, 2, 1}, {0, 1, 1, -1, 1, 0, 1, 1}, {0, 1, 1, 0, 1, 1, 1, 2},
{1, -1, 1, 0, 2, -1, 2, 0}, {0, 1, 0, 2, 1, 1, 1, 2}, {0, 1, 1, 0, 1, 1, 2, 0}};
 
static final int[][] T = {{0, 1, 0, 2, 1, 1, 2, 1}, {1, -2, 1, -1, 1, 0, 2, 0},
{1, 0, 2, -1, 2, 0, 2, 1}, {1, 0, 1, 1, 1, 2, 2, 0}};
 
static final int[][] U = {{0, 1, 0, 2, 1, 0, 1, 2}, {0, 1, 1, 1, 2, 0, 2, 1},
{0, 2, 1, 0, 1, 1, 1, 2}, {0, 1, 1, 0, 2, 0, 2, 1}};
 
static final int[][] V = {{1, 0, 2, 0, 2, 1, 2, 2}, {0, 1, 0, 2, 1, 0, 2, 0},
{1, 0, 2, -2, 2, -1, 2, 0}, {0, 1, 0, 2, 1, 2, 2, 2}};
 
static final int[][] W = {{1, 0, 1, 1, 2, 1, 2, 2}, {1, -1, 1, 0, 2, -2, 2, -1},
{0, 1, 1, 1, 1, 2, 2, 2}, {0, 1, 1, -1, 1, 0, 2, -1}};
 
static final int[][] X = {{1, -1, 1, 0, 1, 1, 2, 0}};
 
static final int[][] Y = {{1, -2, 1, -1, 1, 0, 1, 1}, {1, -1, 1, 0, 2, 0, 3, 0},
{0, 1, 0, 2, 0, 3, 1, 1}, {1, 0, 2, 0, 2, 1, 3, 0}, {0, 1, 0, 2, 0, 3, 1, 2},
{1, 0, 1, 1, 2, 0, 3, 0}, {1, -1, 1, 0, 1, 1, 1, 2}, {1, 0, 2, -1, 2, 0, 3, 0}};
 
static final int[][] Z = {{0, 1, 1, 0, 2, -1, 2, 0}, {1, 0, 1, 1, 1, 2, 2, 2},
{0, 1, 1, 1, 2, 1, 2, 2}, {1, -2, 1, -1, 1, 0, 2, -2}};
 
static final int[][][] shapes = {F, I, L, N, P, T, U, V, W, X, Y, Z};
}</lang>
 
<pre>F I I I I I L L
F F F P P V L -
Z F P P P V L N
Z Z Z V V V L N
- X Z - W W N N
X X X W W - N T
U X U W Y T T T
U U U Y Y Y Y T </pre>
Anonymous user