n皇后问题(回溯法)(超易理解)(详细注释)

问题:

 

N皇后问题是一个经典的问题,描述如下:
N\times N的方格棋盘需要放置N个皇后,使得它们不相互攻击,
即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45度角的斜线上。
对于给定的N,请输出有多少种合法的放置方法。

分析:

 最简单的办法就是暴力搜索,遍历所有的情况,并判断是否符合条件。

本人的办法就是,一层一层的向下判断,我在当前层新添加一个皇后时,我只需要判断本一列上面,左上,右上三个方向是否有皇后,没有则进入到下一层的皇后判断。

我的代码:

#include <iostream>
#include<vector>
using namespace std;

int mycount;
int n;
int ok(int row,int col,vector<vector<int> > res)	//判断当前位置添加皇后是否可行 
{
	for(int i=row-1;i>=0;i--)//向上找 
	{
		if(res[i][col]==1)
			return 0;
	}
	for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)//向左上找 
	{
		if(res[i][j]==1)
			return 0;
	}
	for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)	//向右上找 
	{
		if(res[i][j]==1)
			return 0;
	}
	return 1;
}
void dfs(int k,vector<vector<int> >& res)
{
	if(k>=n)		//当皇后放置完成时,答案计数加一 
		mycount++;
	else
	{
		for(int i=0;i<n;i++)	//当前行的每个位置判断 
		{
			res[k][i]=1;
			if(ok(k,i,res))		//当前位置符合就进入下一行 
			{
				dfs(k+1,res);
			}
			res[k][i]=0;		//回溯 
		}
	}
}
int main()
{

	cin>>n;
	vector<vector<int> > res(n,vector<int>(n,0));
	dfs(0,res);	//第0层 
	cout<<mycount;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值