begin comment pentomino, 130968;
   integer score, nummer, lengte, breedte, aantal stenen, aantal standen,
     i, j, k, teller, lb;
   lengte ≔ read; breedte ≔ read; aantal stenen ≔ read; aantal standen ≔ read;
   lb ≔ lengte × (breedte - 1);
   begin integer array bord [-39 : 100],
        standen, wijzer [1 : aantal stenen],
        informatie [1 : 8 × aantal standen];
      boolean array ongebruikt [1 : aantal stenen];
      procedure output;
      begin integer i, j;
         score ≔ score + 1;
         SPACE (1);
         for j ≔ 1 step 1 until 2 × lengte do
            begin PRINTTEXT (“-”); SPACE (1) end ;
         comment ABSFIXT (6, 2, time); NLCR;
         for i ≔ 0 step lengte until lb do
            begin PRINTTEXT(“I”);
               for j ≔ 1 step 1 until lengte - 1 do
                  begin SPACE (3);
                     if bord [i + j] ≠ bord [i + j + 1]
                       then PRINTTEXT(“I”) else SPACE (1)
                  end ;
               SPACE (3); PRINTTEXT(“I”); NLCR; SPACE (1);
               if i < lb
                 then begin for j ≔ 1 step 1 until lengte do
                     begin if bord [i + j] ≠ bord [i + j + lengte]
                          then begin PRINTTEXT (“-”); SPACE (1);
                           PRINTTEXT (“-”); SPACE (1)
                        end
                        else SPACE (4)
                     end
               end
               else for j ≔ 1 step 1 until 2 × lengte do
                  begin PRINTTEXT (“-”); SPACE (1) end ;
               NLCR
            end ;
         NLCR; NLCR;
         if score = 7 then goto ex
      end output;
      procedure up (veld, kolom); value veld, kolom;
         integer veld, kolom;
      begin integer i, j, k, r, w, steen, aantal;
         nummer ≔ nummer + 1;
         for steen ≔ 1 step 1 until aantal stenen do
              if ongebruikt [steen] then
            begin ongebruikt [steen] ≔ false ;
               bord [veld] ≔ steen;
               aantal ≔ standen [steen] - 1;
               for i ≔ 0 step 1 until aantal do
                  begin w ≔ wijzer [steen] + 4 × i;
                     if bord [informatie [w] + veld] = 0 then
                     begin if bord [informatie [w + 1] + veld] = 0 then
                        begin if bord [informatie [w + 2] + veld] = 0 then
                           begin if bord [informatie [w + 3] + veld] = 0 then
                              begin for j ≔ 0, 1, 2, 3 do
                                      bord [informatie [w + j] + veld] ≔ steen;
                                 if nummer = aantal stenen
                                   then output
                                 else
                                 begin
                                    for k ≔ kolom step 1 until lengte do
                                         for r ≔ 0 step lengte until lb do
                                            if bord [r + k] = 0 then goto beet;
                                    beet: up (r + k, k)
                                 end ;
                                 for j ≔ 0, 1, 2, 3 do
                                      bord [informatie [w + j] + veld] ≔ 0
                              end
                           end
                        end
                     end
                  end ;
               ongebruikt [steen] ≔ true
            end ;
         bord [veld] ≔ 0;
         down: nummer ≔ nummer - 1
      end up;
      teller ≔ 1;
      for i ≔ 1 step 1 until aantal stenen do
         begin j ≔ read; comment steennummer, wordt niet gebruikt;
            wijzer [i] ≔ teller; standen [i] ≔ read;
            for j ≔ 1 step 1 until standen [i] do
               begin for k ≔ 0 step 1 until 3 do
                       informatie [teller + k] ≔ read;
                  teller ≔ teller + 4
               end
         end ;
      for i ≔ - 39 step 1 until 0,
        61 step 1 until 100 do bord [i] ≔ - 1;
      for i ≔ 1 step 1 until 60 do bord [i] ≔ 0;
      for i ≔ 1 step 1 until aantal stenen do
           ongebruikt [i] ≔ true ;
      score ≔ nummer ≔ 0;
      NLCR; PRINTTEXT (“The first 7 solutions:”); NLCR; NLCR; NLCR;
      up (1, 1);
      ex:
   end
end