amiga-e/amigae33a/E_v3.3a/Src/Src/Pd/queens.e

81 lines
1.9 KiB
Plaintext

-> Copyright © 1996 Guichard Damien.
OPT OSVERSION=37
OBJECT queen
myrow:LONG
mycolumn:LONG
neighbor:PTR TO queen
boardsize:LONG
ENDOBJECT
PROC build(aQueen,col,size) OF queen
self.neighbor:=aQueen
self.mycolumn:=col
self.myrow:=1
self.boardsize:=size
IF self.neighbor THEN self.neighbor.first()
ENDPROC
PROC checkCol(colNumber,rowNumber) OF queen
DEF cd
IF rowNumber=self.myrow THEN RETURN FALSE
cd:=colNumber-self.mycolumn
IF self.myrow+cd=rowNumber THEN RETURN FALSE
IF self.myrow-cd=rowNumber THEN RETURN FALSE
IF self.neighbor THEN RETURN self.neighbor.checkCol(colNumber,rowNumber)
ENDPROC TRUE
PROC first() OF queen
self.myrow:=1
ENDPROC self.checkrow()
PROC next() OF queen
self.myrow:=self.myrow+1
ENDPROC self.checkrow()
PROC checkrow() OF queen
IF self.neighbor=NIL
IF self.myrow>self.boardsize THEN RETURN 0
RETURN self.myrow
ENDIF
WHILE self.myrow<=self.boardsize
IF self.neighbor.checkCol(self.mycolumn,self.myrow) THEN
RETURN self.myrow
self.myrow:=self.myrow+1
ENDWHILE
IF self.neighbor.next()=0 THEN RETURN 0
ENDPROC self.first()
PROC printboard() OF queen
DEF x
IF self.neighbor THEN self.neighbor.printboard()
FOR x:=1 TO self.boardsize
FputC(stdout,IF x=self.myrow THEN "Q" ELSE ".")
ENDFOR
FputC(stdout,"\n")
ENDPROC
PROC main() HANDLE
DEF myargs:PTR TO LONG,rdargs
DEF lastq=NIL:PTR TO queen,newq:PTR TO queen
DEF size,x
myargs:=New(8)
IF (rdargs:=ReadArgs('BOARDSIZE/N/A,ALL/S',myargs,NIL))=NIL THEN Raise(1)
IF (size:=Long(myargs[0]))<=0 THEN Raise(1)
FOR x:=1 TO size DO lastq:=NEW newq.build(lastq,x,size)
IF lastq.first() THEN lastq.printboard()
IF myargs[1]=FALSE THEN Raise(0)
WHILE TRUE
EXIT CtrlC()
EXIT lastq.next()=0
FputC(stdout,"\n")
lastq.printboard()
ENDWHILE
EXCEPT DO
IF rdargs THEN FreeArgs(rdargs)
IF exception THEN WriteF('Bad Args!\n')
ENDPROC