前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode 52. N皇后 II----回溯篇8

leetcode 52. N皇后 II----回溯篇8

作者头像
大忽悠爱学习
发布2021-11-15 11:15:28
1660
发布2021-11-15 11:15:28
举报
文章被收录于专栏:c++与qt学习
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

N皇后||题解集合

回溯法

本题就是leetcode 面试题 08.12. 八皇后----回溯篇7,也就是我们回溯篇7中讲过的问题,只不过这里区别在于,第 51 题需要得到所有可能的解,这道题只需要得到可能的解的数量。因此这道题可以使用第 51 题的做法,只需要将得到所有可能的解改成得到可能的解的数量即可。

这里只演示使用回溯篇6中第一种方式的做法,详情可以去看回溯篇6

具体求解过程也不再啰嗦,详情去看回溯篇6

代码:

代码语言:javascript
复制
class Solution 
{
	int sum = 0;
	vector<int> a; //用一个一维数组a来表示每个皇后的位置,a[2] = 4表示皇后的位置位于a(2, 4), 即二行四列上
public:
		int totalNQueens(int n) 
		{
			backTrace(0, n);
			return sum;
		}
	void backTrace(int n, int N)
	{
		if (n == N)//最后一个皇后放置完毕
			sum++;
		else
		{
			//对每一列进行试探
			for (int i = 0; i < N; i++)
			{
				//将当前皇后放置在第n行,第i列上
				a.push_back(i);
				//如果当前n行i列能够放置皇后,那么就继续寻找下一个皇后的合适放置位置
				if (isValild(n))
					backTrace(n + 1, N);
				//如果找到了一种解,或者当前状态无解,那么恢复到上一层的状态,去寻找其他可能解
				a.pop_back();

			}
		}
	}
	bool isValild(int n)//这里n是正在放置第几个皇后,也可以理解为正在第几行放置皇后
	{
		//第n行要放置的皇后需要和前面n-1行已经放置的皇后进行检查,看是否产生位置冲突
		for (int i = 0; i < n; i++)
		{
			if (a[n] == a[i] || abs(a[n] - a[i]) == abs(n - i))
				return false;
		}
		return true;
	}
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • N皇后||题解集合
  • 回溯法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档