Solve a Numbrix puzzle: Difference between revisions
Content added Content deleted
No edit summary |
(Added Kotlin) |
||
Line 944: | Line 944: | ||
28 25 24 21 10 1 2 3 4 |
28 25 24 21 10 1 2 3 4 |
||
27 26 23 22 9 8 7 6 5 </pre> |
27 26 23 22 9 8 7 6 5 </pre> |
||
=={{header|Kotlin}}== |
|||
{{trans|Java}} |
|||
<lang scala>// version 1.2.0 |
|||
val example1 = listOf( |
|||
"00,00,00,00,00,00,00,00,00", |
|||
"00,00,46,45,00,55,74,00,00", |
|||
"00,38,00,00,43,00,00,78,00", |
|||
"00,35,00,00,00,00,00,71,00", |
|||
"00,00,33,00,00,00,59,00,00", |
|||
"00,17,00,00,00,00,00,67,00", |
|||
"00,18,00,00,11,00,00,64,00", |
|||
"00,00,24,21,00,01,02,00,00", |
|||
"00,00,00,00,00,00,00,00,00" |
|||
) |
|||
val example2 = listOf( |
|||
"00,00,00,00,00,00,00,00,00", |
|||
"00,11,12,15,18,21,62,61,00", |
|||
"00,06,00,00,00,00,00,60,00", |
|||
"00,33,00,00,00,00,00,57,00", |
|||
"00,32,00,00,00,00,00,56,00", |
|||
"00,37,00,01,00,00,00,73,00", |
|||
"00,38,00,00,00,00,00,72,00", |
|||
"00,43,44,47,48,51,76,77,00", |
|||
"00,00,00,00,00,00,00,00,00" |
|||
) |
|||
val moves = listOf(1 to 0, 0 to 1, -1 to 0, 0 to -1) |
|||
lateinit var board: List<String> |
|||
lateinit var grid: List<IntArray> |
|||
lateinit var clues: IntArray |
|||
var totalToFill = 0 |
|||
fun solve(r: Int, c: Int, count: Int, nextClue: Int): Boolean { |
|||
if (count > totalToFill) return true |
|||
val back = grid[r][c] |
|||
if (back != 0 && back != count) return false |
|||
if (back == 0 && nextClue < clues.size && clues[nextClue] == count) { |
|||
return false |
|||
} |
|||
var nextClue2 = nextClue |
|||
if (back == count) nextClue2++ |
|||
grid[r][c] = count |
|||
for (m in moves) { |
|||
if (solve(r + m.second, c + m.first, count + 1, nextClue2)) return true |
|||
} |
|||
grid[r][c] = back |
|||
return false |
|||
} |
|||
fun printResult(n: Int) { |
|||
println("Solution for example $n:") |
|||
for (row in grid) { |
|||
for (i in row) { |
|||
if (i == -1) continue |
|||
print("%2d ".format(i)) |
|||
} |
|||
println() |
|||
} |
|||
} |
|||
fun main(args: Array<String>) { |
|||
for ((n, ex) in listOf(example1, example2).withIndex()) { |
|||
board = ex |
|||
val nRows = board.size + 2 |
|||
val nCols = board[0].split(",").size + 2 |
|||
var startRow = 0 |
|||
var startCol = 0 |
|||
grid = List(nRows) { IntArray(nCols) { -1 } } |
|||
totalToFill = (nRows - 2) * (nCols - 2) |
|||
val lst = mutableListOf<Int>() |
|||
for (r in 0 until nRows) { |
|||
if (r in 1 until nRows - 1) { |
|||
val row = board[r - 1].split(",") |
|||
for (c in 1 until nCols - 1) { |
|||
val value = row[c - 1].toInt() |
|||
if (value > 0) lst.add(value) |
|||
if (value == 1) { |
|||
startRow = r |
|||
startCol = c |
|||
} |
|||
grid[r][c] = value |
|||
} |
|||
} |
|||
} |
|||
lst.sort() |
|||
clues = lst.toIntArray() |
|||
if (solve(startRow, startCol, 1, 0)) printResult(n + 1) |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Solution for example 1: |
|||
49 50 51 52 53 54 75 76 81 |
|||
48 47 46 45 44 55 74 77 80 |
|||
37 38 39 40 43 56 73 78 79 |
|||
36 35 34 41 42 57 72 71 70 |
|||
31 32 33 14 13 58 59 68 69 |
|||
30 17 16 15 12 61 60 67 66 |
|||
29 18 19 20 11 62 63 64 65 |
|||
28 25 24 21 10 1 2 3 4 |
|||
27 26 23 22 9 8 7 6 5 |
|||
Solution for example 2: |
|||
9 10 13 14 19 20 63 64 65 |
|||
8 11 12 15 18 21 62 61 66 |
|||
7 6 5 16 17 22 59 60 67 |
|||
34 33 4 3 24 23 58 57 68 |
|||
35 32 31 2 25 54 55 56 69 |
|||
36 37 30 1 26 53 74 73 70 |
|||
39 38 29 28 27 52 75 72 71 |
|||
40 43 44 47 48 51 76 77 78 |
|||
41 42 45 46 49 50 81 80 79 |
|||
</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |