您的位置:首页 > 产品设计 > UI/UE

LeetCode:N-Queens II

2016-06-08 18:46 615 查看


N-Queens II

Total Accepted: 45401 Total
Submissions: 114053 Difficulty: Hard

Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.



Subscribe to see which companies asked this question

Hide Tags
 Backtracking

Hide Similar Problems
 (H) N-Queens

思路:

由于N个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组nums
,数组中第i个数字表示位于第i行的皇后的列号。先把nums的N个数字分别用0~N-1初始化,接下来我们要做的事情就是对数组nums做全排列。由于我们是用不同的数字初始化数组中的数字,因此任意两个皇后肯定不同列。我们只需要判断得到的每一个排列对应的N个皇后是不是在同一对角斜线上,也就是数组的两个下标i和j,是不是i-j==nums[i]-nums[j]或者j-i==nums[i]-nums[j]。

因此实际上就是在(元重复元素)全排列(参考:LeetCode:Permutations)的基础上多了一个判断而已。

c++ code:

class Solution {
public:
int totalNQueens(int n) {

vector<int> nums(n);
for(int i=0;i<n;i++)
nums[i]=i;

int count = 0;
permute(nums, 0 ,count);
return count;
}

// 自定义函数
void permute(vector<int> &nums, int pos, int &count) {

int n = nums.size();
if(pos==n) {
if(check(nums))
count++;
return;
}
for(int i=pos;i<n;i++) {
swap(nums[pos], nums[i]);
permute(nums, pos+1, count);
swap(nums[i], nums[pos]);
}

}

bool check(vector<int> &nums) {

int n = nums.size();
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++)
// 判断是否在主、副对角线上
if(i-j == nums[i]-nums[j] || j-i == nums[i]-nums[j])
return false;
}
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: