标签:改变 简洁 push alt hat pre sel other public
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.
Solution:
(Python)
class Solution(object): def solveNQueens(self, n): """ :type n: int :rtype: List[List[str]] """ res = [] def dfs(rcSum, rcDiff, queens): if len(queens) == n: queens = [‘.‘ * i + ‘Q‘ + ‘.‘ * (n-i-1) for i in queens] res.append(queens) return row = len(queens) for col in range(n): if col in queens or row+col in rcSum or row-col in rcDiff: continue dfs(rcSum+[row+col], rcDiff+[row-col], queens+[col]) dfs([], [], []) return res
(C++)
class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> res; vector<string> out (n, string(n, ‘.‘)); dfs(n, res, out, 0); return res; } void dfs(int n, vector<vector<string>>& res, vector<string>& out, int row) { if (row == n) { res.push_back(out); return; } for (int col = 0; col < n; col++) { out[row][col] = ‘Q‘; if (isValid(n, row, col, out)) dfs(n, res, out, row+1); out[row][col] = ‘.‘; } } bool isValid(int n, int row, int col, vector<string>& out) { // 横向改变Queen,因此不需要检查水平方向 // vertical for (int i = 0; i < row; i++) if (out[i][col] == ‘Q‘) return false; // left diagonal for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) if (out[i][j] == ‘Q‘) return false; // right diagonal for (int i = row-1, j = col+1; i >= 0 && j < n; i--, j++) if (out[i][j] == ‘Q‘) return false; return true; } };
Python版相比C++更简洁,用queens[i]记录第i+1行的皇后所在的列序号。经典for循环中调dfs递归。注意Python解法用了这样一种原理:row+col或row-col相等,对角线可达。
LeetCode in Python 51. N-Queens
标签:改变 简洁 push alt hat pre sel other public
原文地址:https://www.cnblogs.com/lowkeysingsing/p/11194045.html