N-Queens

LeetCode 51 · View on LeetCode

Place n queens on an n×n board so no two attack each other. Place one queen per row, using sets to track occupied columns and diagonals for O(1) conflict checking.

package main

import "fmt"

func solveNQueens(n int) [][]string {
	result := [][]string{}
	cols := make(map[int]bool)
	diag1 := make(map[int]bool) // row - col
	diag2 := make(map[int]bool) // row + col
	board := make([][]byte, n)
	for i := range board {
		board[i] = make([]byte, n)
		for j := range board[i] {
			board[i][j] = '.'
		}
	}

	var backtrack func(row int)
	backtrack = func(row int) {
		if row == n {
			snapshot := make([]string, n)
			for i := range board {
				snapshot[i] = string(board[i])
			}
			result = append(result, snapshot)
			return
		}
		for col := 0; col < n; col++ {
			if cols[col] || diag1[row-col] || diag2[row+col] {
				continue
			}
			board[row][col] = 'Q'
			cols[col] = true
			diag1[row-col] = true
			diag2[row+col] = true

			backtrack(row + 1)

			board[row][col] = '.'
			cols[col] = false
			diag1[row-col] = false
			diag2[row+col] = false
		}
	}

	backtrack(0)
	return result
}

func main() {
	solutions := solveNQueens(4)
	for _, sol := range solutions {
		for _, row := range sol {
			fmt.Println(row)
		}
		fmt.Println()
	}
	// .Q..
	// ...Q
	// Q...
	// ..Q.
	//
	// ..Q.
	// Q...
	// ...Q
	// .Q..
}
▶ Open Go Playground

Copy the code above and paste to run

© 2026 ByteLearn.dev. Free courses for developers. · Privacy