LeetCode--n-queens-ii
2018-01-11 22:02
316 查看
题目描述
Follow up for N-Queens problem.Now, instead outputting board configurations, return the total number of distinct solutions.
方法一:递归
class Solution { public: int totalNQueens(int n) { // write your code here int solutions = 0; /*用一维数组存储*/ vector<int> queue(n, -1); /*用一维数组存储*/ recursiveFun(solutions, queue, n, 0); return solutions; } /*递归实现*/ void recursiveFun(int &solutions, vector<int> &queue, int n, int row) { if (row >= n) { ++solutions; }//if else{ for (int j = 0; j < n; ++j) { /*递归在上一个任务成功后*/ if (isValid(queue, row, j)) { queue[row] = j; recursiveFun(solutions, queue, n, row + 1); }//if }//else }//else } /*判断在r行c列放置皇后,是否合法*/ bool isValid(vector<int> queue, int r, int c) { if (queue.empty()) return true; for (int i = 0; i < r; ++i) { if (queue[i] == c || abs(i - r) == abs(queue[i] - c)) return false; }//for return true; } };
方法二:非递归
class Solution { public: /*方法二、非递归实现*/ int totalNQueens(int n) { // write your code here int solutions = 0; /*用一维数组存储*/ vector<int> queue(n, -1); int i = 0, j = 0; while (i < n) { while (j < n) { if (isValid(queue, i, j)) { /*第i行的皇后的列为j*/ queue[i] = j; /*继续探测下一个皇后的位置*/ j = 0; break; }//if else{ ++j; }//else }//while /*第i行没有找到可以放置皇后的位置,说明该方案不可行*/ if (-1 == queue[i]) { /*当前没有可行解的行标为0,说明已经找完所有的解*/ if (0 == i) { break; 6884 }//if /*回溯到上一行*/ else { --i; /*改变上一行皇后的位置*/ j = queue[i] + 1; queue[i] = -1; continue; }//else }//if /*找到一个可行解*/ if (i == n - 1) { ++solutions; /*不能在此处结束程序,因为我们要找的是N皇后问题的所有解,此时应该清除该行的皇后, 从当前放置皇后列数的下一列继续探测。*/ j = queue[i] + 1; queue[i] = -1; continue; }//if ++i; }//while return solutions; } /*判断在r行c列放置皇后,是否合法*/ bool isValid(vector<int> queue, int r, int c) { if (queue.empty()) return true; for (int i = 0; i < r; ++i) { if (queue[i] == c || abs(i - r) == abs(queue[i] - c)) return false; }//for return true; } };
转自:http://blog.csdn.net/fly_yr/article/details/51135059
相关文章推荐
- N-Queens II N皇后问题(有几种放法)@LeetCode
- leetcode 52. N-Queens II & leetcode 51 N-Queens (N皇后问题)
- leetcode51/52-N-Queens I/II(n皇后问题)
- LeetCode - N-Queens I && II
- leetcode做题总结,回溯法(N-Queens, N-QueensII,Combination SumI&II,wordbreak II, SubsetsI&II)
- leetcode--n_queens&&n_queens_II
- [LeetCode] N-Queens II N皇后问题之二
- LeetCode N-Queens II
- LeetCode "N-Queens II"
- LeetCode题解:N-Queens I and II
- 【LeetCode】N-Queens II && 【九度】题目1254:N皇后问题
- [LeetCode 51&52] N-Queens I & II (N皇后问题)
- [leetcode]N-Queens II @ Python
- 【LeetCode】N-Queens II N皇后问题 回溯法
- 52. N-Queens II Leetcode Python
- Leetcode_n-queens-ii
- [Leetcode] n queens ii n皇后问题
- [LeetCode] 52. N-Queens II N皇后问题 II
- [Leetcode] N Queens I,II
- 52. N-Queens II Leetcode Python