60 lines
1.2 KiB
Plaintext
60 lines
1.2 KiB
Plaintext
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));
|
|
]
|