# =========================================================================== # # From: # # www.contextfreeart.org/gallery2/#design/4091 # # HEIGHT: 500 # WIDTH: 500 # # =========================================================================== #

// ================================================== // Eight Queens Puzzle // en.wikipedia.org/wiki/Eight_queens_puzzle // // Design randomly shows one of the 92 solutions. // ==================================================

startshape Try_Position(0,(0,0,0,0,0,0,0,0),0)

CF::Impure=1 SolNr=randint(1,92) // ————- Solution Number

vector8 Roll(Y,vector8 Pos)=

if (Y<>0, Roll(Y-1,(Pos[1,7],Pos[0])), Pos)

vector8 Place(X,Y,vector8 Pos)=

let(L=Roll(Y,Pos); I=(X,L[1,7]); Roll(8-Y,I))

number Frei(X,Y,vector8 Pos,i)=

let( Xi=Pos[Y-i]; X<>Xi-i && X<>Xi && X<>Xi+i )

number Free(X,Y,vector8 Pos,i)=

if (i>Y,1,if(Frei(X,Y,Pos,i),Free(X,Y,Pos,i+1),0))

shape Try_Position(Y, vector8 Pos, Nr) {

X=Pos[Y]
if (X==8) { // ---- Backtracking or Stop
  if (Y==0) SQUARE[] // ----------- Stop
  else { // ----------------------- Backtracking
    newPos1=Place(-1,Y,Pos)
    newX   =Pos[Y-1]+1 
    newPos2=Place(newX,Y-1,newPos1)
    Try_Position(Y-1,newPos2,Nr)[]
  }
} else {
  if (Free(X,Y,Pos,1)) {
    if (Y==7) { // ---------------- Solution
      if (Nr+1==SolNr) Solution(Pos,SolNr)[]
      else {    // ------ Find next Solution
        newPos=Place(X+1,Y,Pos)
        Try_Position(Y,newPos,Nr+1)[]
      }
    } else {    // ---------------- Forward
      newPos=Place(0,Y+1,Pos)
      Try_Position(Y+1,newPos,Nr)[]
    }
  } else { // --------------- Queen to right
    newPos=Place(X+1,Y,Pos)
    Try_Position(Y,newPos,Nr)[]

} } }

shape Solution(vector8 Pos, Nr) {

SQUARE[x 3.5 y 3.5 s 9  h 30 sat 0.52 b 0.91]
loop X=8 [x 1]   loop Y=8 [y 1]
 if (mod(X+Y,2)) SQUARE[h 30 sat 0.38 b 1.00]
 else            SQUARE[h 30 sat 0.66 b 0.82]
loop j=8 [y 1] Queen[x (Pos[j])]
Natural(Nr)[x 7.95 y -0.75 s 0.4]

}

shape Queen {

loop R=-21,22,10.5 []
  transform[[s 0.1 y -5 r R y 6.5]]
  { CIRCLE[y 2] TRIANGLE[s 1 4] }
loop 2 [y -0.3] CIRCLE[s 0.50 0.10]
loop 4 [y -0.1] SQUARE[s 0.45 0.05]

}

shape Natural(natural i) {

if (i>9) Natural(div(i,10))[x -0.5]
digit=mod(i,10) // --------- Mycelium design 3966
B=select(digit, 125,17,107,59,23,62,126,25,127,63)
loop i=7 [] if ( bitand(2^i,B) )
 transform[[skew 8 0 x -0.25 -0.15 s 0.30]]
  SQUARE[[y (i<4) r -(90*i) x 0.5  s 0.15 0.75]]

}

# runcfdg $CFDG/eight_queens_problem.cfdg