75 lines
1.5 KiB
Text
75 lines
1.5 KiB
Text
import "./fmt" for Fmt
|
|
|
|
var grid = []
|
|
var w = 0
|
|
var h = 0
|
|
var len = 0
|
|
var cnt = 0
|
|
var next = [0] * 4
|
|
var dir = [[0, -1], [-1, 0], [0, 1], [1, 0]]
|
|
|
|
var walk // recursive
|
|
walk = Fn.new { |y, x|
|
|
if (y == 0 || y == h || x == 0 || x == w) {
|
|
cnt = cnt + 2
|
|
return
|
|
}
|
|
var t = y * (w + 1) + x
|
|
grid[t] = grid[t] + 1
|
|
grid[len-t] = grid[len-t] + 1
|
|
for (i in 0..3) {
|
|
if (grid[t + next[i]] == 0) {
|
|
walk.call(y + dir[i][0], x + dir[i][1])
|
|
}
|
|
}
|
|
grid[t] = grid[t] - 1
|
|
grid[len-t] = grid[len-t] - 1
|
|
}
|
|
|
|
var solve // recursive
|
|
solve = Fn.new { |hh, ww, recur|
|
|
h = hh
|
|
w = ww
|
|
if (h&1 != 0) {
|
|
var t = w
|
|
w = h
|
|
h = t
|
|
}
|
|
if (h&1 != 0) return 0
|
|
if (w == 1) return 1
|
|
if (w == 2) return h
|
|
if (h == 2) return w
|
|
var cy = (h/2).floor
|
|
var cx = (w/2).floor
|
|
len = (h + 1) * (w + 1)
|
|
grid = List.filled(len, 0)
|
|
len = len - 1
|
|
next[0] = -1
|
|
next[1] = -w - 1
|
|
next[2] = 1
|
|
next[3] = w + 1
|
|
if (recur) cnt = 0
|
|
var x = cx + 1
|
|
while (x < w) {
|
|
var t = cy * (w + 1) + x
|
|
grid[t] = 1
|
|
grid[len-t] = 1
|
|
walk.call(cy - 1, x)
|
|
x = x + 1
|
|
}
|
|
cnt = cnt + 1
|
|
if (h == w) {
|
|
cnt = cnt * 2
|
|
} else if ((w&1 == 0) && recur) {
|
|
solve.call(w, h, false)
|
|
}
|
|
return cnt
|
|
}
|
|
|
|
for (y in 1..10) {
|
|
for (x in 1..y) {
|
|
if ((x&1 == 0) || (y&1 ==0)) {
|
|
Fmt.print("$2d x $2d : $d", y, x, solve.call(y, x, true))
|
|
}
|
|
}
|
|
}
|