Solve N queens
After a five year hiatus, I decided to attempt to solve the famous N queens problem again. This time, instead of modeling the chess board using a `[[Bool]]`, I'm using `[Integer]` where the `Integer` indicates which column has a queen. This is a bit lighter in RAM.
This commit is contained in:
		
							parent
							
								
									14f6169fcf
								
							
						
					
					
						commit
						7672049e1c
					
				
					 1 changed files with 46 additions and 0 deletions
				
			
		
							
								
								
									
										46
									
								
								scratch/facebook/n-queens.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								scratch/facebook/n-queens.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| def print_board(board): | ||||
|     result = [] | ||||
|     for row in range(8): | ||||
|         r = [] | ||||
|         for col in range(8): | ||||
|             r.append("X" if col == board[row] else "-") | ||||
|         result.append(" ".join(r)) | ||||
|     print("\n".join(result)) | ||||
|     print() | ||||
| 
 | ||||
| def can_place(board, row, col): | ||||
|     column_occupied = not any([board[i] == col for i in range(row)]) | ||||
| 
 | ||||
|     diagonals_clear = True | ||||
|     for r in range(row): | ||||
|         w = abs(col - board[r]) | ||||
|         h = abs(r - row) | ||||
|         if w == h: | ||||
|             diagonals_clear = False | ||||
|             break | ||||
| 
 | ||||
|     return all([column_occupied, diagonals_clear]) | ||||
| 
 | ||||
| def init_board(): | ||||
|     board = [] | ||||
|     for row in range(8): | ||||
|         board.append(None) | ||||
|     return board | ||||
| 
 | ||||
| def copy_board(board): | ||||
|     return board[:] | ||||
| 
 | ||||
| def n_queens(): | ||||
|     do_n_queens(init_board(), 0, 0) | ||||
| 
 | ||||
| def do_n_queens(board, row, col): | ||||
|     if row == 8: | ||||
|         print_board(board) | ||||
|         return | ||||
|     for i in range(col, 8): | ||||
|         if can_place(board, row, i): | ||||
|             copy = copy_board(board) | ||||
|             copy[row] = i | ||||
|             do_n_queens(copy, row + 1, 0) | ||||
| 
 | ||||
| n_queens() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue