mirror of
https://github.com/irmen/prog8.git
synced 2024-11-25 04:31:20 +00:00
71 lines
1.9 KiB
Plaintext
71 lines
1.9 KiB
Plaintext
|
%import textio
|
||
|
%zeropage basicsafe
|
||
|
|
||
|
; Recursive N-Queens solver.
|
||
|
; The problem is: find all possible ways to place 8 Queen chess pieces on a chess board, so that none of them attacks any other.
|
||
|
; (this program prints all solutions without taking mirroring and flipping the chess board into account)
|
||
|
; Note: this program can be compiled for multiple target systems.
|
||
|
|
||
|
main {
|
||
|
const ubyte NUMQUEENS=8
|
||
|
ubyte[NUMQUEENS] board
|
||
|
|
||
|
sub could_place(byte row, byte col) -> bool {
|
||
|
byte i
|
||
|
for i in 0 to row-1 {
|
||
|
if board[i]==col or board[i]-i==col-row or board[i]+i==col+row
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
ubyte solution_count
|
||
|
sub print_solution() {
|
||
|
solution_count++
|
||
|
txt.home()
|
||
|
txt.print("found solution ")
|
||
|
txt.print_ub(solution_count)
|
||
|
txt.nl()
|
||
|
ubyte i
|
||
|
for i in 0 to NUMQUEENS-1 {
|
||
|
ubyte col = board[i]
|
||
|
txt.chrout(' ')
|
||
|
repeat col txt.chrout('.')
|
||
|
txt.chrout('q')
|
||
|
repeat NUMQUEENS-col-1 txt.chrout('.')
|
||
|
txt.nl()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub place_queen(ubyte row) {
|
||
|
if row == NUMQUEENS {
|
||
|
print_solution()
|
||
|
return
|
||
|
}
|
||
|
ubyte col
|
||
|
for col in 0 to NUMQUEENS-1 {
|
||
|
if could_place(row as byte, col as byte) {
|
||
|
board[row] = col
|
||
|
; we need to save the local variables row and col.
|
||
|
sys.push(row)
|
||
|
sys.push(col)
|
||
|
place_queen(row + 1)
|
||
|
; restore the local variables after the recursive call.
|
||
|
col = sys.pop()
|
||
|
row = sys.pop()
|
||
|
board[row] = 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub start() {
|
||
|
cbm.SETTIM(0,0,0)
|
||
|
txt.clear_screen()
|
||
|
place_queen(0)
|
||
|
txt.nl()
|
||
|
uword duration=100*cbm.RDTIM16()/6
|
||
|
txt.print_uw(duration)
|
||
|
txt.print(" milliseconds\n")
|
||
|
}
|
||
|
}
|