# =========================================================================== # # 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