Pentomino tiling: Difference between revisions
Content added Content deleted
(→{{header|C#}}: fix bug) |
(→{{header|Kotlin}}: Amended in line with recent changes to Java entry) |
||
Line 393: | Line 393: | ||
{{trans|Java}} |
{{trans|Java}} |
||
<lang scala>// Version 1.1.4-3 |
<lang scala>// Version 1.1.4-3 |
||
import java.util.Random |
import java.util.Random |
||
// four (x, y) pairs are listed, (0,0) not included |
|||
val F = arrayOf( |
val F = arrayOf( |
||
intArrayOf(1, -1, 1, 0, 1, 1, 2, 1), intArrayOf(0, 1, 1, -1, 1, 0, 2, 0), |
intArrayOf(1, -1, 1, 0, 1, 1, 2, 1), intArrayOf(0, 1, 1, -1, 1, 0, 2, 0), |
||
Line 403: | Line 402: | ||
intArrayOf(1, -1, 1, 0, 1, 1, 2, -1), intArrayOf(1, -1, 1, 0, 2, 0, 2, 1) |
intArrayOf(1, -1, 1, 0, 1, 1, 2, -1), intArrayOf(1, -1, 1, 0, 2, 0, 2, 1) |
||
) |
) |
||
val I = arrayOf( |
val I = arrayOf( |
||
intArrayOf(0, 1, 0, 2, 0, 3, 0, 4), intArrayOf(1, 0, 2, 0, 3, 0, 4, 0) |
intArrayOf(0, 1, 0, 2, 0, 3, 0, 4), intArrayOf(1, 0, 2, 0, 3, 0, 4, 0) |
||
) |
) |
||
val L = arrayOf( |
val L = arrayOf( |
||
intArrayOf(1, 0, 1, 1, 1, 2, 1, 3), intArrayOf(1, 0, 2, 0, 3, -1, 3, 0), |
intArrayOf(1, 0, 1, 1, 1, 2, 1, 3), intArrayOf(1, 0, 2, 0, 3, -1, 3, 0), |
||
Line 414: | Line 413: | ||
intArrayOf(1, 0, 2, 0, 3, 0, 3, 1), intArrayOf(1, -3, 1, -2, 1, -1, 1, 0) |
intArrayOf(1, 0, 2, 0, 3, 0, 3, 1), intArrayOf(1, -3, 1, -2, 1, -1, 1, 0) |
||
) |
) |
||
val N = arrayOf( |
val N = arrayOf( |
||
intArrayOf(0, 1, 1, -2, 1, -1, 1, 0), intArrayOf(1, 0, 1, 1, 2, 1, 3, 1), |
intArrayOf(0, 1, 1, -2, 1, -1, 1, 0), intArrayOf(1, 0, 1, 1, 2, 1, 3, 1), |
||
Line 421: | Line 420: | ||
intArrayOf(0, 1, 0, 2, 1, 2, 1, 3), intArrayOf(1, -1, 1, 0, 2, -1, 3, -1) |
intArrayOf(0, 1, 0, 2, 1, 2, 1, 3), intArrayOf(1, -1, 1, 0, 2, -1, 3, -1) |
||
) |
) |
||
val P = arrayOf( |
val P = arrayOf( |
||
intArrayOf(0, 1, 1, 0, 1, 1, 2, 1), intArrayOf(0, 1, 0, 2, 1, 0, 1, 1), |
intArrayOf(0, 1, 1, 0, 1, 1, 2, 1), intArrayOf(0, 1, 0, 2, 1, 0, 1, 1), |
||
Line 428: | Line 427: | ||
intArrayOf(0, 1, 0, 2, 1, 1, 1, 2), intArrayOf(0, 1, 1, 0, 1, 1, 2, 0) |
intArrayOf(0, 1, 0, 2, 1, 1, 1, 2), intArrayOf(0, 1, 1, 0, 1, 1, 2, 0) |
||
) |
) |
||
val T = arrayOf( |
val T = arrayOf( |
||
intArrayOf(0, 1, 0, 2, 1, 1, 2, 1), intArrayOf(1, -2, 1, -1, 1, 0, 2, 0), |
intArrayOf(0, 1, 0, 2, 1, 1, 2, 1), intArrayOf(1, -2, 1, -1, 1, 0, 2, 0), |
||
Line 438: | Line 437: | ||
intArrayOf(0, 2, 1, 0, 1, 1, 1, 2), intArrayOf(0, 1, 1, 0, 2, 0, 2, 1) |
intArrayOf(0, 2, 1, 0, 1, 1, 1, 2), intArrayOf(0, 1, 1, 0, 2, 0, 2, 1) |
||
) |
) |
||
val V = arrayOf( |
val V = arrayOf( |
||
intArrayOf(1, 0, 2, 0, 2, 1, 2, 2), intArrayOf(0, 1, 0, 2, 1, 0, 2, 0), |
intArrayOf(1, 0, 2, 0, 2, 1, 2, 2), intArrayOf(0, 1, 0, 2, 1, 0, 2, 0), |
||
intArrayOf(1, 0, 2, -2, 2, -1, 2, 0), intArrayOf(0, 1, 0, 2, 1, 2, 2, 2) |
intArrayOf(1, 0, 2, -2, 2, -1, 2, 0), intArrayOf(0, 1, 0, 2, 1, 2, 2, 2) |
||
) |
) |
||
val W = arrayOf( |
val W = arrayOf( |
||
intArrayOf(1, 0, 1, 1, 2, 1, 2, 2), intArrayOf(1, -1, 1, 0, 2, -2, 2, -1), |
intArrayOf(1, 0, 1, 1, 2, 1, 2, 2), intArrayOf(1, -1, 1, 0, 2, -2, 2, -1), |
||
intArrayOf(0, 1, 1, 1, 1, 2, 2, 2), intArrayOf(0, 1, 1, -1, 1, 0, 2, -1) |
intArrayOf(0, 1, 1, 1, 1, 2, 2, 2), intArrayOf(0, 1, 1, -1, 1, 0, 2, -1) |
||
) |
) |
||
val X = arrayOf(intArrayOf(1, -1, 1, 0, 1, 1, 2, 0)) |
val X = arrayOf(intArrayOf(1, -1, 1, 0, 1, 1, 2, 0)) |
||
val Y = arrayOf( |
val Y = arrayOf( |
||
intArrayOf(1, -2, 1, -1, 1, 0, 1, 1), intArrayOf(1, -1, 1, 0, 2, 0, 3, 0), |
intArrayOf(1, -2, 1, -1, 1, 0, 1, 1), intArrayOf(1, -1, 1, 0, 2, 0, 3, 0), |
||
Line 457: | Line 456: | ||
intArrayOf(1, -1, 1, 0, 1, 1, 1, 2), intArrayOf(1, 0, 2, -1, 2, 0, 3, 0) |
intArrayOf(1, -1, 1, 0, 1, 1, 1, 2), intArrayOf(1, 0, 2, -1, 2, 0, 3, 0) |
||
) |
) |
||
val Z = arrayOf( |
val Z = arrayOf( |
||
intArrayOf(0, 1, 1, 0, 2, -1, 2, 0), intArrayOf(1, 0, 1, 1, 1, 2, 2, 2), |
intArrayOf(0, 1, 1, 0, 2, -1, 2, 0), intArrayOf(1, 0, 1, 1, 1, 2, 2, 2), |
||
intArrayOf(0, 1, 1, 1, 2, 1, 2, 2), intArrayOf(1, -2, 1, -1, 1, 0, 2, -2) |
intArrayOf(0, 1, 1, 1, 2, 1, 2, 2), intArrayOf(1, -2, 1, -1, 1, 0, 2, -2) |
||
) |
) |
||
val shapes = arrayOf(F, I, L, N, P, T, U, V, W, X, Y, Z) |
val shapes = arrayOf(F, I, L, N, P, T, U, V, W, X, Y, Z) |
||
val rand = Random() |
|||
val symbols = "FILNPTUVWXYZ-" |
val symbols = "FILNPTUVWXYZ-".toCharArray() |
||
val nRows = 8 |
val nRows = 8 |
||
val nCols = 8 |
val nCols = 8 |
||
val target = 12 |
|||
val blank = 12 |
val blank = 12 |
||
val grid = Array(nRows) { IntArray(nCols) } |
val grid = Array(nRows) { IntArray(nCols) } |
||
val placed = BooleanArray( |
val placed = BooleanArray(symbols.size - 1) |
||
fun tryPlaceOrientation(o: IntArray, r: Int, c: Int, shapeIndex: Int): Boolean { |
fun tryPlaceOrientation(o: IntArray, r: Int, c: Int, shapeIndex: Int): Boolean { |
||
for (i in 0 until o.size step 2) { |
for (i in 0 until o.size step 2) { |
||
Line 485: | Line 484: | ||
return true |
return true |
||
} |
} |
||
fun removeOrientation(o: IntArray, r: Int, c: Int) { |
fun removeOrientation(o: IntArray, r: Int, c: Int) { |
||
grid[r][c] = -1 |
grid[r][c] = -1 |
||
for (i in 0 until o.size step 2) grid[r + o[i]][c + o[i + 1]] = -1 |
for (i in 0 until o.size step 2) grid[r + o[i]][c + o[i + 1]] = -1 |
||
} |
} |
||
fun solve(pos: Int, numPlaced: Int): Boolean { |
fun solve(pos: Int, numPlaced: Int): Boolean { |
||
if (numPlaced == |
if (numPlaced == shapes.size) return true |
||
val row = pos / nCols |
val row = pos / nCols |
||
val col = pos % nCols |
val col = pos % nCols |
||
if (grid[row][col] != -1) return solve(pos + 1, numPlaced) |
if (grid[row][col] != -1) return solve(pos + 1, numPlaced) |
||
for (i in 0 until shapes.size) { |
for (i in 0 until shapes.size) { |
||
if (!placed[i]) { |
if (!placed[i]) { |
||
Line 511: | Line 510: | ||
} |
} |
||
fun shuffleShapes() { |
|||
var n = shapes.size |
|||
while (n > 1) { |
|||
val r = rand.nextInt(n--) |
|||
val tmp = shapes[r] |
|||
shapes[r] = shapes[n] |
|||
shapes[n] = tmp |
|||
val tmpSymbol= symbols[r] |
|||
⚫ | |||
symbols[n] = tmpSymbol |
|||
⚫ | |||
} |
|||
fun printResult() { |
fun printResult() { |
||
for (r in grid) { |
for (r in grid) { |
||
for (i in r) { |
for (i in r) print("${symbols[i]} ") |
||
val j = if (i in 0 until symbols.length) i else blank |
|||
⚫ | |||
⚫ | |||
println() |
println() |
||
} |
} |
||
} |
} |
||
fun main(args: Array<String>) { |
fun main(args: Array<String>) { |
||
shuffleShapes() |
|||
for (r in 0 until nRows) grid[r].fill(-1) |
for (r in 0 until nRows) grid[r].fill(-1) |
||
for (i in 0..3) |
for (i in 0..3) { |
||
var randRow: Int |
|||
var randCol: Int |
|||
do { |
|||
randRow = rand.nextInt(nRows) |
|||
randCol = rand.nextInt(nCols) |
|||
} |
|||
while (grid[randRow][randCol] == blank) |
|||
grid[randRow][randCol] = blank |
|||
} |
|||
if (solve(0, 0)) printResult() |
if (solve(0, 0)) printResult() |
||
else println("No solution") |
else println("No solution") |