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, | |