码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode dfs N-Queens II

时间:2014-09-10 09:38:20      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   os   io   ar   for   div   问题   

N-Queens II

 Total Accepted: 12668 Total Submissions: 38109My Submissions

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

bubuko.com,布布扣





题意:返回n皇后问题的所有可能解的总数
思路:dfs
因为只要求给出所有可能数的总数,所以当dfs遍历到叶子结点的时候,只要把表示
总数的变量加1就可以了。
这道题设置了额外的三个bool数组分别表示某一列,
某一主对角线,某一副对角线是否已经有皇后占据着。
由某个坐标(i,j),可得到它的主对角线是i+j,它的副对角线是i-j,
由于i-j可能是负数,所以我们给它加上 n,保证它不为负数
复杂度:O(n!),空间O(n)

int _n;
vector<bool> is_col_chosen;
vector<bool> is_main_diag_chosen;
vector<bool> is_anti_diag_chosen;
int c;
bool is_chosen(int i, int j){
	return is_col_chosen[j] || is_main_diag_chosen[i + j] || is_anti_diag_chosen[i - j + _n];
}


void dfs(int nth_queen, vector<int> &columns){
	if(nth_queen == _n){
		c++;
	}
	for(int j = 0; j < _n; ++j){
		if(!is_chosen(nth_queen, j)){
			is_col_chosen[j] = is_main_diag_chosen[nth_queen + j] = is_anti_diag_chosen[nth_queen - j + _n] = true;
			columns.push_back(j);
			dfs(nth_queen + 1,columns);
			columns.pop_back();
			is_col_chosen[j] = is_main_diag_chosen[nth_queen + j] = is_anti_diag_chosen[nth_queen - j + _n] = false;
		}
	}
}


int totalNQueens(int n){
	c = 0;
	_n = n;
	is_col_chosen = is_main_diag_chosen = is_anti_diag_chosen = vector<bool>(2 * n, false);
	vector<int> columns;
	dfs(0, columns);
	return c;
}


Leetcode dfs N-Queens II

标签:style   http   color   os   io   ar   for   div   问题   

原文地址:http://blog.csdn.net/zhengsenlie/article/details/39177129

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!