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