odra.13 graphsqueens
The N Queens problem AUTOR: FELIKS KLUZNIAK
* AUTOR: FELIKS KLUZNIAK. *GRAFY SKIEROWANE BEZ PETLI . -AJOP(".",1,"X'(X'X)")! -AJOP("&",2,"(X'X)'X")! *DODANIE NOWEJ DROGI . +LUK(*OD,*DO,*KM) -AJOUT(+(DROGA(*OD,*DO,*KM)).NIL). *WSZYSTKIE DROGI OD DANEGO PUNKTU. +WSZYSTKIEOD(*OD) -W(POCZATEK&*OD,0) -IMPAS. +W(*D&*OD,*KM) -WYPISZ(*D&*OD,*KM) -DROGA(*OD,*DO,*K) -PLUS(*KM,*K,*M) -W(*D&*OD&*DO,*M). +WYPISZ(*D,*KM) -LIGNE -SORM("DLUGOSC ") -SORT(*KM) -SORM(" :") -WYP(*D) -LIGNE. +WYP(POCZATEK&*OD) -LIGNE -SORM(" ") -SORT(*OD) -/. +WYP(*A&*B) -WYP(*A) -SORM(" -> ") -SORT(*B). * WSZYSTKIE DROGI MIEDZY DWOMA PUNKTAMI . +WSZYSTKIEODDO(*OD,*DO) -V(POCZATEK&*OD,*DO,0) -IMPAS. +V(*D&*DO,*DO,*KM) -WYPISZ(*D&*DO,*KM) -/. +V(*D&*OD,*DO,*KM) -DROGA(*OD,*TO,*K) -PLUS(*KM,*K,*M) -V(*D&*OD&*TO,*DO,*M). *GRAFY CYKLICZNE. +DROGI(*OD,*DO) -DR(POCZATEK&*OD,*DO,0). +DR(*D&*DO,*DO,*KM) -WYPISZ(*D&*DO,*KM) -/ -IMPAS. +DR(*D&*OST,*DO,*K) -DROGA(*OST,*NAST,*M) -NIECYKL(*NAST,*D&*OST) -PLUS(*K,*M, *KM) -DR(*D&*OST&*NAST,*DO,*KM). +NIECYKL(*X,POCZATEK) -/. +NIECYKL(*PUNKT,*D&*PUNKT) -/ -IMPAS. +NIECYKL(*X,*D&*Y) -NIECYKL(*X,*D). -LUK(A,BC,5)! -LUK(A,CD,6)! -LUK(AB,CD,7)! -LUK(AC,CD,8)! -LUK(A,AB,1)! -LUK(AB,BC,2)! -LUK(BC,CD,3)! -LUK(A,AC,4)! -WSZYSTKIEOD(CD)! -WSZYSTKIEOD(BC)! -WSZYSTKIEOD(AC)! -WSZYSTKIEOD(AB)! -WSZYSTKIEOD(A)! -WSZYSTKIEODDO(CD,AB)! -WSZYSTKIEODDO(AB,BC)! -WSZYSTKIEODDO(AB,CD)! -WSZYSTKIEODDO(A,CD)! -LUK(CD,A,9)! -LUK(BC,A,10)! -DROGI(BC,A)! -DROGI(A,A)! -DROGI(AB,CD)! -DROGI(A,CD)! -SOP! *** THE N QUEENS PROBLEM . * BOARD REPRESENTATION: A LIST OF ROWS IN OCCUPIED COLUMNS . -AJOP(".",1,"X'(X'X)")! +QUEENS(*N) -Q(*N,0,NIL). +Q(*N,*N,*BOARD) -PICTURE(*BOARD,*N) -/. +Q(*N,*M,*BOARD) -GENERATEROW(*N,*ROW) -NOCONFLICT(*ROW.*BOARD) -PLUS(*M,1,*M1) -Q(*N,*M1,*ROW.*BOARD). +GENERATEROW(0,*X) -/ -IMPAS. +GENERATEROW(*N,*N). +GENERATEROW(*N,*ROW) -MOINS(*N,1,*M) -GENERATEROW(*M,*ROW). * CHECK FOR CONFLICT . +NOCONFLICT(*BOARD) -CONFLICT(*BOARD) -/ -IMPAS. +NOCONFLICT(*BOARD). +CONFLICT(*ROW.*OTHERS) -SAMEROW(*ROW,*OTHERS) -/. +CONFLICT(*ROW.*OTHERS) -SAMELOWDIAG(*ROW,*OTHERS) -/. +CONFLICT(*ROW.*OTHERS) -SAMEHIGHDIAG(*ROW,*OTHERS) -/. +CONFLICT -IMPAS. +SAMEROW(*ROW,*ROW.*OTHERS) -/. +SAMEROW(*ROW,*AROW.*OTHERS) -/ -SAMEROW(*ROW,*OTHERS). +SAMEROW(*ROW,*EDGE) -IMPAS. +SAMELOWDIAG(*ROW,*NEXTL.*OTHERS) -PLUS(*ROW,1,*NEXTL) -/. +SAMELOWDIAG(*ROW,*AROW.*OTHERS) -PLUS(*ROW,1,*NEXTL) -/ -SAMELOWDIAG(*NEXTL, *OTHERS). +SAMELOWDIAG(*ROW,*EDGE) -IMPAS. +SAMEHIGHDIAG(0,*BOARD) -/ -IMPAS. +SAMEHIGHDIAG(*ROW,*NEXTH.*OTHERS) -MOINS(*ROW,1,*NEXTH) -/. +SAMEHIGHDIAG(*ROW,*AROW.*OTHERS) -MOINS(*ROW,1,*NEXTH) -/ -SAMEHIGHDIAG(*NEXTH, *OTHERS). +SAMEHIGHDIAG(*ROW,*EDGE) -IMPAS. * PRINT THE BOARD . +PICTURE(*BOARD,*N) -PICT(*BOARD,*N,*N). +PICT(*BOARD,*N,0) -DRAWROW(*N) -LIGNE -/. +PICT(*BOARD,*N,*M) -DRAWROW(*N) -QUEENSINROW(*M,*BOARD) -MOINS(*M,1,*M1) -PICT(*BOARD,*N,*M1). +DRAWROW(0) -SORM(".") -LIGNE -/. +DRAWROW(*N) -SORM(".-") -MOINS(*N,1,*M) -DRAWROW(*M). +QUEENSINROW(*M,*M.*REST) -/ -SORM("IQ") -QUEENSINROW(*M,*REST). +QUEENSINROW(*M,*OTHER.*REST) -SORM("I ") -QUEENSINROW(*M,*REST) -/. +QUEENSINROW(*M,NIL) -SORM("I") -LIGNE. -QUEENS(0)! -QUEENS(1)! -QUEENS(2)! -QUEENS(3)! -QUEENS(4)! -QUEENS(5)! -QUEENS(6)! -TTY!