2n皇后问题

题目:
在这里插入图片描述
在这里插入图片描述
代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[10][10],ans,n,vy[10],vv1[10],vv2[10];
//vy,v1,vv2分别有四种状态0是黑白皇后都没放,1是放了黑皇后,2是放了白皇后,3是都放了 
void dfs(int x,int p)
{
	if(p == 2 && x == n){ans++;return;}//两个皇后都放好了 
	if(p == 1 && x == n){dfs(0,2);return;}//黑皇后放好,开始放白皇后 
	for(int i = 0;i < n;i++){
		if(a[x][i] && vy[i] != 3 && vy[i] != p && vv1[x + i] != 3 && vv1[x + i] != p && vv2[x - i + n] != 3 && vv2[x - i + n] != p){
			a[x][i] = 0;
			vy[i] += p;
			vv1[i + x] += p;
			vv2[x - i + n] += p;
			dfs(x + 1,p);
			vy[i] -= p;
			vv1[i + x] -= p;
			vv2[x - i + n] -= p;
			a[x][i] = 1;			
		} 
	}
}
int main()
{
	cin >> n; 
	for(int i = 0;i < n;i++)
		for(int j = 0;j < n;j++)
			cin >> a[i][j];
	dfs(0,1);//1代表先放黑皇后 
	cout << ans << endl;
	return 0;
}

这道题基本思路就是先放黑皇后然后再放白皇后,假设放黑皇后时p = 1,放白皇后时p = 3。因为刚开始先放黑皇后所以先传入1,这里我是先从第一行开始,然后第二,第三…一直这样下去。bfs时当x = n了,说明此时某种皇后已经放好了,如果此时p=1,那就说明黑皇后放好了,此时需要再次dfs并将p改为3(从此开始只放白皇后了),如果p = 3,那就说明都已经放好了,这里需要将次数加一然后返回就可以了。

每次dfs进行选择放置皇后的时候都需要满足一系列条件:当a[i][j] = 0表示不可放皇后了,还有就是传统8皇后的限制:行列,两条对角线不能放在一起。只是需要开三个数组分别来对列和两条对角线进行判重,具体过程上述代码有,这里就不重复了。

总体来说这道题是在八皇后问题上再进一步,个人觉得是一道不错的题。

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/87727949