The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
回溯法,DFS,没啥好说的。
1 class Solution { 2 public: 3 bool isValid(vector<string> &board, int x, int y) { 4 for (int i = 0; i < x; ++i) { 5 if (board[i][y] == 'Q') return false; 6 } 7 for (int i = 0; i < board.size(); ++i) { 8 for (int j = 0; j < board.size(); ++j) { 9 if (i != x && j != y && i-j == x-y && board[i][j] == 'Q') 10 return false; 11 if (i != x && j != y && i+j == x+y && board[i][j] == 'Q') 12 return false; 13 } 14 } 15 return true; 16 } 17 18 void solveHelper(vector<vector<string> > &res, vector<string> &board, int idx) { 19 if (idx == board.size()) { 20 res.push_back(board); 21 return; 22 } 23 for (int i = 0; i < board.size(); ++i) { 24 board[idx][i] = 'Q'; 25 if (isValid(board, idx, i)) { 26 solveHelper(res, board, idx + 1); 27 } 28 board[idx][i] = '.'; 29 } 30 } 31 32 vector<vector<string> > solveNQueens(int n) { 33 vector<vector<string> > res; 34 vector<string> board; 35 string row; 36 for (int i = 0; i < n; ++i) { 37 row.push_back('.'); 38 } 39 for (int i = 0; i < n; ++i) { 40 board.push_back(row); 41 } 42 solveHelper(res, board, 0); 43 return res; 44 } 45 };