78 lines
1.7 KiB
Plaintext
78 lines
1.7 KiB
Plaintext
Dim Shared As Ubyte grilla()
|
|
Dim Shared As Integer ancho, alto, longitud
|
|
Dim Shared As Integer cnt
|
|
Dim Shared As Integer sgte(3)
|
|
Dim Shared As Integer direcc(3, 1) => {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}
|
|
|
|
Sub Camino(y As Integer, x As Integer)
|
|
If y = 0 Or y = alto Or x = 0 Or x = ancho Then
|
|
cnt += 2
|
|
Return
|
|
End If
|
|
Dim As Integer t = y * (ancho + 1) + x
|
|
grilla(t) += 1
|
|
grilla(longitud - t) += 1
|
|
For i As Integer = 0 To 3
|
|
If grilla(t + sgte(i)) = 0 Then Camino(y + direcc(i, 0), x + direcc(i, 1))
|
|
Next
|
|
grilla(t) -= 1
|
|
grilla(longitud - t) -= 1
|
|
End Sub
|
|
|
|
Function Solve(hh As Integer, ww As Integer, recur As Boolean) As Integer
|
|
alto = hh
|
|
ancho = ww
|
|
|
|
If (alto And 1) <> 0 Then Swap alto, ancho
|
|
|
|
Select Case True
|
|
Case (alto And 1) = 1
|
|
Return 0
|
|
Case ancho = 1
|
|
Return 1
|
|
Case ancho = 2
|
|
Return alto
|
|
Case alto = 2
|
|
Return ancho
|
|
End Select
|
|
|
|
Dim As Integer cy = alto \ 2
|
|
Dim As Integer cx = ancho \ 2
|
|
|
|
Redim grilla((alto + 1) * (ancho + 1))
|
|
longitud = (alto + 1) * (ancho + 1) - 1
|
|
sgte(0) = -1
|
|
sgte(1) = -ancho - 1
|
|
sgte(2) = 1
|
|
sgte(3) = ancho + 1
|
|
|
|
If recur Then cnt = 0
|
|
|
|
For x As Integer = cx + 1 To ancho - 1
|
|
Dim As Integer t = cy * (ancho + 1) + x
|
|
grilla(t) = 1
|
|
grilla(longitud - t) = 1
|
|
Camino(cy - 1, x)
|
|
Next
|
|
cnt += 1
|
|
|
|
If alto = ancho Then
|
|
cnt *= 2
|
|
Elseif (ancho And 1) = 0 And recur Then
|
|
Solve(ancho, alto, 0)
|
|
End If
|
|
|
|
Return cnt
|
|
End Function
|
|
|
|
Dim As Integer y, x
|
|
For y = 1 To 10
|
|
For x = 1 To y
|
|
If (x And 1) = 0 Or (y And 1) = 0 Then
|
|
Print Using "& x &: &"; y; x; Solve(y, x, True)
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
Sleep
|