RE: How much memory may a HPPL program use on a G2?
Hi Stefan,
Are you still reading this thread?
After all, you started it, and Tyann and I turned it into something completely different, which didn't really help you. So that you can still extract something interesting from this thread, I'm attaching your QUEENS solution (under the name QUEENS2), slightly modified by me to make it resistant to the list length limitations by using the text strings. For larger board sizes like 10x10, 11x11, and so on, it definitely works faster than your original solution and can handle 12x12, 13x13, 14x14 and maybe more... if you like to wait
Code:
LOCAL
POSI,SOLCNT,UNICNT,
COLS,DU,DD,ALLSOLS,UNISOLS;
LOCAL LASTP;
EXPORT QUEENS2(DIMENSION)
BEGIN
LOCAL N,START,END;
N:=DIMENSION;
//PRINT(N+" Queens");
SOLCNT:=0;
UNICNT:=0;
MAKELIST(0,X,1,N,1)▶POSI▶COLS;
MAKELIST(0,X,1,2*N-1,1)▶DU▶DD;
"|"▶ALLSOLS▶UNISOLS;
START:=TICKS;
TRY(N,1);
END:=TICKS;
SOLCNT:=SOLCNT*2;
TEXTOUT_P("FIN",0,60);
TEXTOUT_P(STRING((TICKS-START)/1000,1,2)+" s",0,80);
WAIT(0)
END;
LOCAL TRY(N,ROW)
BEGIN
LOCAL M,COL,DUI,DDI,DUP,DUP2,I;
IF ROW>2 THEN
M:=N
ELSE
IF ROW=1 THEN
M:=IP((N+1)/2)
ELSE
IF N MOD 2=1 AND POSI(1)=(N+1)/2 THEN
M:=IP(N/2)
ELSE
M:=N
END
END
END;
FOR COL FROM 1 TO M DO
DUI:=ROW-COL+N;
DDI:=ROW+COL-1;
IF COLS(COL)=0 AND DU(DUI)=0 AND DD(DDI)=0 THEN
POSI(ROW):=COL;
IF ROW=N THEN
SOLCNT:=SOLCNT+1;
//IF POS(ALLSOLS,POSI)=0 THEN
IF INSTRING(ALLSOLS,CHAR(POSI)+"|")=0 THEN
//ALLSOLS:=CONCAT(ALLSOLS,{POSI});
ALLSOLS:=ALLSOLS+CHAR(POSI)+"|";
DUP:=POSI;
DUP2:=MIRR(N,DUP);
//ALLSOLS:=CONCAT(ALLSOLS,{DUP2});
ALLSOLS:=ALLSOLS+CHAR(DUP2)+"|";
FOR I FROM 1 TO 3 DO
DUP:=TURN(N,DUP);
//ALLSOLS:=CONCAT(ALLSOLS,{DUP});
ALLSOLS:=ALLSOLS+CHAR(DUP)+"|";
DUP2:=MIRR(N,DUP);
//ALLSOLS:=CONCAT(ALLSOLS,{DUP2});
ALLSOLS:=ALLSOLS+CHAR(DUP2)+"|";
END;
//UNISOLS:=CONCAT(UNISOLS,{POSI});
UNISOLS:=UNISOLS+CHAR(POSI)+"|";
UNICNT:=UNICNT+1;
SHOW(N,POSI)
END
ELSE
COLS(COL):=1; DU(DUI):=1; DD(DDI):=1;
TRY(N,ROW+1);
COLS(COL):=0; DU(DUI):=0; DD(DDI):=0
END
END
END
END;
LOCAL MIRR(N,P)
BEGIN
LOCAL R,M;
M:=P;
FOR R FROM 1 TO N DO
M(R):=N+1-P(R)
END;
RETURN M;
END;
LOCAL TURN(N,P)
BEGIN
LOCAL R,T;
T:=P;
FOR R FROM 1 TO N DO
T(P(R)):=N+1-R
END;
RETURN T;
END;
LOCAL SHOW(N,P)
BEGIN
LOCAL D,I,T,E,OX,OY,M;
LOCAL GRAY,WHITE,BLACK,CLR;
D:=IP(237/N);
OY:=IP((239-N*D)/2);
OX:=319-N*D-OY;
GRAY:=RGB(224,224,224);
WHITE:=RGB(255,255,255);
BLACK:=RGB(0,0,0);
M:=IP(D/6);
IF UNICNT=1 THEN
RECT();
E:=N*D;
FOR I FROM 0 TO N DO
T:=I*D;
LINE_P(OX,T+OY,E+OX,T+OY);
LINE_P(T+OX,OY,T+OX,E+OY)
END;
FOR I FROM 1 TO N DO
FOR E FROM 1 TO N DO
IF (E+I) MOD 2 = 0 THEN
RECT_P((E-1)*D+1+OX,(N-I)*D+1+OY,E*D-1+OX,(N-I+1)*D-1+OY,GRAY)
END;
IF P(I)=E THEN
RECT_P((E-1)*D+M+OX,(N-I)*D+M+OY,E*D-M+OX,(N-I+1)*D-M+OY,WHITE,BLACK)
END
END
END
ELSE
FOR I FROM 1 TO N DO
IF P(I)≠LASTP(I) THEN
RECT_P((LASTP(I)-1)*D+M+OX,(N-I)*D+M+OY,LASTP(I)*D-M+OX,(N-I+1)*D-M+OY,IFTE((LASTP(I)+I) MOD 2=0,GRAY,WHITE));
RECT_P((P(I)-1)*D+M+OX,(N-I)*D+M+OY,P(I)*D-M+OX,(N-I+1)*D-M+OY,WHITE,BLACK)
END
END
END;
LASTP:=P;
TEXTOUT_P(UNICNT,0,0,3,BLACK,100,WHITE);
TEXTOUT_P(SOLCNT,0,20,3,BLACK,100,WHITE);
//TEXTOUT_P(STRING(SIZE(ALLSOLS)),0,40,3,BLACK,150,WHITE)
END;
Piotr Kowalewski
|