288
TÉCNICAS DE DISEÑO DE ALGORITMOS
BEGIN NEW(n2); n2^.xmax:=n1^.xmax; n2^.ymax:=n1^.ymax; n2^.t:=n1^.t; n2^.puestas:=n1^.puestas; n2^.k:=n1^.k; END Copiar;
Y también de otra función para determinar si una pieza puede ser colocada o no en una determinada posición: PROCEDURE ColocarPieza (inicial:BOOLEAN; (* primera pieza?*) VAR n:nodo; (* nodo vivo *) p:CARDINAL; (* num. pieza a poner *) x,y:CARDINAL; (* donde ponerla *) a,b:CARDINAL (* largo y alto *) ):BOOLEAN; (* puedo ponerla? *) VAR i,j:CARDINAL; conexa:BOOLEAN; BEGIN IF (inicial)AND((x<>0)OR(y<>0)) THEN RETURN FALSE END; (* primero miramos que cabe *) IF ((x+a-1)>XMAX)OR((y+b-1)>YMAX) THEN RETURN FALSE END; (* despues miramos que no pisa a ninguna pieza *) FOR i:=x TO x+a-1 DO FOR j:=y TO y+b-1 DO IF n^.t[i,j]<>0 THEN RETURN FALSE END END END; (* despues miramos que sea adyacente a otra *) IF NOT inicial THEN conexa:=FALSE; IF x=0 THEN i:=0 ELSE i:=x-1 END; WHILE (i<=Max2(x+a,XMAX)) AND (NOT conexa) DO IF (((y>0)AND(n^.t[i,y-1]<>0))OR ((y+b<=YMAX)AND(n^.t[i,y+b]<>0))) THEN conexa:=TRUE END; INC(i) END; IF y=0 THEN j:=0 ELSE j:=y-1 END; WHILE (j<=Max2(y+b,YMAX)) AND (NOT conexa) DO IF (((x>0)AND(n^.t[x-1,j]<>0))OR ((x+a<=XMAX)AND(n^.t[x+a,j]<>0))) THEN conexa:=TRUE END; INC(j) END; IF NOT conexa THEN RETURN FALSE END; END; (* ahora la ponemos en el tablero *) FOR i:=x TO x+a-1 DO FOR j:=y TO y+b-1 DO n^.t[i,j]:=p