Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
59
Task/Cut-a-rectangle/XPL0/cut-a-rectangle.xpl0
Normal file
59
Task/Cut-a-rectangle/XPL0/cut-a-rectangle.xpl0
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
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));
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue