include xpllib; \for Print char Grid; int W, H, Len, Cnt; int Next(4), Dir; proc Walk(Y, X); int Y, X; int I, T; [if Y=0 or Y=H or X=0 or X=W then [Cnt:= Cnt+2; return]; T:= Y * (W + 1) + X; Grid(T):= Grid(T)+1; Grid(Len-T):= Grid(Len-T)+1; for I:= 0 to 4-1 do if Grid(T + Next(I)) = 0 then Walk(Y+Dir(I,0), X+Dir(I,1)); Grid(T):= Grid(T)-1; Grid(Len-T):= Grid(Len-T)-1; ]; func Solve(HH, WW, Recur); int HH, WW, Recur; int T, CX, CY, X; [H:= HH; W:= WW; if H & 1 then [T:= W; W:= H; H:= T]; if H & 1 then return 0; if W = 1 then return 1; if W = 2 then return H; if H = 2 then return W; CY:= H/2; CX:= W/2; Len:= (H + 1) * (W + 1); Grid:= ReallocMem(Grid, Len); FillMem(Grid, 0, Len); Len:= Len-1; Next(0):= -1; Next(1):= -W - 1; Next(2):= 1; Next(3):= W + 1; if Recur then Cnt:= 0; for X:= CX+1 to W-1 do [T:= CY * (W + 1) + X; Grid(T):= 1; Grid(Len - T):= 1; Walk(CY - 1, X); ]; Cnt:= Cnt+1; if H = W then Cnt:= Cnt * 2 else if (W&1) = 0 and Recur then Solve(W, H, 0); return Cnt; ]; int Y, X; [Grid:= 0; Dir:= [[0, -1], [-1, 0], [0, 1], [1, 0]]; for Y:= 1 to 10 do for X:= 1 to Y do if (X&1) = 0 or (Y&1) = 0 then Print("%d x %d: %d\n", Y, X, Solve(Y, X, 1)); ]