PENTOMINO|
begin comment pentomino, 130968;
comment library A6, A12;
integer solution count, max solution count;
integer piece number, piece count, place count;
integer board length, board width, board area;
integer i, j, k, position;
integer printer, reader;
integer form2id;
integer form3id;
form2id := format([nd_]);
form3id := format([ndd_]);
printer := 30;
open(printer);
reader := 20;
open(reader);
max solution count := read(reader);
newline(printer,1);
writetext(printer,[The*first*]); write(printer, form2id, max solution count); writetext(printer,[*solutions:]);
newline(printer,3);
board length := read(reader);
board width := read(reader);
piece count := read(reader);
place count := read(reader);
board area := board length × (board width - 1);
begin
integer array board [-39 : 100];
integer array place, index [1 : piece count];
integer array information [1 : 8 × place count];
boolean array unused [1 : piece count];
procedure print solution;
begin
integer i, j;
writetext(printer,[[c_]print*solution:[c_]]);
writetext(printer,[[c_]board*length*=]);
write(printer, form3id, board length);
newline(printer,1);
writetext(printer,[[c_]board*width*=]);
write(printer, form3id, board width);
newline(printer,1);
writetext(printer,[[c_]piece*count*=]);
write(printer, form3id, piece count);
newline(printer,1);
writetext(printer,[[c_]place*count*=]);
write(printer, form3id, place count);
newline(printer,1);
solution count := solution count + 1;
if solution count > max solution count then
begin
writetext(printer,[[c_]solution*count*=]);
write(printer, form3id, solution count);
newline(printer,3);
goto END OF RUN;
end;
newline(printer,1);
for j := 1 step 1 until 2 × board length do
begin
writetext(printer,[-]);
writetext(printer,[*])
end;
newline(printer,1);
for i := 0 step board length until board area do
begin
writetext(printer,[I_]);
for j := 1 step 1 until board length - 1 do
begin
writetext(printer,[***]);
if board[i + j] ± board[i + j + 1] then
writetext(printer,[I_])
else
writetext(printer,[*])
end;
writetext(printer,[***]);
writetext(printer,[I_]);
newline(printer,1);
writetext(printer,[*]);
if i < board area then
begin
for j := 1 step 1 until board length do
begin
if board[i + j] ± board[i + j + board length] then
begin
writetext(printer,[-]); writetext(printer,[*]);
writetext(printer,[-]); writetext(printer,[*])
end
else
writetext(printer,[****])
end
end
else
for j := 1 step 1 until 2 × board length do
begin
writetext(printer,[-]);
writetext(printer,[*])
end;
newline(printer,1)
end;
newline(printer,2);
end print solution;
procedure up (field, column); value field, column; integer field, column;
begin
integer i, j, k, r, w, piece, count;
piece number := piece number + 1;
for piece := 1 step 1 until piece count do
if unused[piece] then
begin
unused[piece] := false;
board[field] := piece;
count := place[piece] - 1;
for i := 0 step 1 until count do
begin
w := index[piece] + 4 × i;
if board[information[w] + field] = 0 then
begin
if board[information[w + 1] + field] = 0 then
begin
if board[information[w + 2] + field] = 0 then
begin
if board[information[w + 3] + field] = 0 then
begin
for j := 0, 1, 2, 3 do
board[information[w + j] + field] := piece;
if piece number = piece count then
print solution
else
begin
for k := column step 1 until board length do
for r := 0 step board length until board area do
if board[r + k] = 0 then goto NEXT;
NEXT:
up (r + k, k)
end;
for j := 0, 1, 2, 3 do
board[information[w + j] + field] := 0
end
end
end
end
end;
unused[piece] := true
end;
board[field] := 0;
DOWN:
piece number := piece number - 1
end up;
position := 1;
for i := 1 step 1 until piece count do
begin
j := read(reader); comment stone piece number, is not used;
index[i] := position; place[i] := read(reader);
for j := 1 step 1 until place[i] do
begin
for k := 0 step 1 until 3 do
information[position + k] := read(reader);
position := position + 4
end
end;
for i := - 39 step 1 until 0, + 61 step 1 until 100 do
board[i] := - 1;
for i := 1 step 1 until 60 do
board[i] := 0;
for i := 1 step 1 until piece count do
unused[i] := true;
solution count := piece number := 0;
up (1, 1);
END OF RUN:
end inner block;
close(reader);
close(printer);
end
|
9,
10, 6, 12, 63,
1, 1, -9, 1, 11, 2,
2, 2, 1, 2, 3, 4, 10, 20, 30, 40,
3, 4, 1, 10, 20, 21, 1, 11, 20, 21, -10, -9, -8, 2, 10, 11, 12, 2,
4, 4, 1, 11, 21, 22, 1, -9, -19, -18, 10, 11, 12, 22, -10, -9, -8, -18,
5, 4, 1, 11, 21, 2, 1, -9, -19, 2, 1, 2, -8, 12, 10, -10, 1, 2,
6, 4, 1, 2, 12, 22, 1, 2, -8, -18, 1, 2, 10, 20, 1, 2, -10, -20,
7, 4, 1, 11, 12, 22, 1, -9, -8, -18, 10, 11, 21, 22, -10, -9, -19, -18,
8, 8, 1, 11, 12, 13, 1, -9, -8, -7, 1, 2, 12, 13, 1, 2, -8, -7, 10, 20, 21, 31, 10, 20, 19, 29, 10, 11, 21, 31, 10, 9, 19, 29,
9, 8, 1, -9, 2, 12, 1, 11, 2, -8, 10, 11, 21, 12, -10, -9, -19, -8, 1, 11, 21, 12, 1, -9, -19, -8, 1, 11, -9, 12, 1, 11, -9, -8,
10, 8, 1, 2, 3, 12, 1, 2, 3, -8, 10, 20, 30, 11, -10, -20, -30, -9, 1, 11, 21, -9, 1, -9, -19, 11, 11, 1, 2, 3, -9, 1, 2, 3,
11, 8, 1, 2, 3, 13, 1, 2, 3, -7, 10, 20, 30, 1, -10, -20, -30, 1, 1, 11, 21, 31, 1, -9, -19, -29, 10, 1, 2, 3, -10, 1, 2, 3,
12, 8, 1, 2, 11, 12, 1, 2, -9, -8, 1, 2, 10, 11, 1, 2, -10, -9, 1, 10, 11, 20, 1, 10, 11, 21, 1, -10, -9, -20, 1, -10, -9, -19,
|
|