算法描述:
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.
Example:
Input: 4 Output: [ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ] Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
解题思路:要求所有可能性,用回溯法求解。注意皇后合法性判断的三个条件,水平,45度斜线,135度斜线的计算方法。
vector<vector<string>> solveNQueens(int n) { vector<vector<string>> results; vector<string> temp(n,string(n,'.')); backtracking(n, results, temp, 0); return results; } void backtracking(int n, vector<vector<string>>& results, vector<string>& temp, int row){ if(row == n){ results.push_back(temp); return; } for(int col=0; col< n; col++){ temp[row][col] = 'Q'; if(isValid(temp, row, col, n)){ backtracking(n,results,temp, row+1); } temp[row][col] ='.'; } } bool isValid(vector<string>& temp, int row, int col, int n){ for(int i=0; i != row; i++){ if(temp[i][col] == 'Q') return false; } for(int i=row-1, j=col-1; i >=0 && j >=0; i--,j--){ if(temp[i][j]=='Q') return false; } for(int i=row-1,j=col+1; i>=0 && j < n; i--,j++){ if(temp[i][j]=='Q') return false; } return true; }