(经典递归+回溯)leetcode困难51. N 皇后

题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

样例

示例 2:

输入:n = 1
输出:[[“Q”]]

数据范围

1 <= n <= 9

分析

解读题意,给定一个n,返回nn棋盘上n个皇后所有摆放合法的情况。
递归回溯的经典问题n皇后,递归思路:建立一个n
n的数组表示当前的棋盘摆放情况,再建立一个n*n的数组表示当前可以摆放的位置,0表示可以摆放,1表示不可以,按行的顺序摆放皇后,每次摆放后,更新判断状态的数组,递归完成后回溯,将当前放皇后的位置回溯到最初的状态,状态的数组同时也需要回溯到上一步的状态。最后将摆放完成的情况放到答案的数组中

代码部分

1.初始化

分析递归需要的参数
1.题目中给定的n作为出口条件的判断
2.存放当前棋盘皇后的位置数组
3.存放当前哪个格子可以放皇后的数组
4.存放最终答案的数组

		vector<vector<string> > ans;		//存放答案
		vector<string> location(n);		//存放当前的棋盘
		vector<vector<bool> > mark(n,vector<bool>(n));	//当前棋盘的状态

初始化当前放皇后的棋盘,将当前的n*n数组所有元素初始化为’.’

	void inilocation(vector<string> &location,int n)
	{
   
		for(int i=0;i<n;i++)
		{
   
			location[i].append(n,'.');
		}
	}

初始化存放状态的数组,将所有格子都初始化为0

	void inimark(vector<vector<bool> > &mark,int n)	//初始化棋盘状态 
	{
   
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
			{
   
				mark[i][j]=false;
			} 
	}
2.递归部分

递归还是分成两个部分,首先分析当前要做的事情,最后分析出口条件
当前要做的事情就是遍历所有的列,判断在哪里可以摆放然后递归深入
回溯部分,将当前的皇后位置回溯,将状态数组回溯,这里创建一个状态数组的镜像,回溯的时候直接将镜像赋值给当前的状态数组即可

		
		//现在能做的事情	
		for(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White boy&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值