蓝桥杯--2n皇后问题(结合n皇后问题)

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T68
试题 基础练习 2n皇后问题

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
  输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0
解:运用n皇后问题知识,稍加改变即可。典型的dfs用法。上代码:

#include<iostream> 
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int  quenb[50];      //黑皇后
int quenw[50];       //白皇后
int a[100][100];     
int n;
int num=0;
int check(int a[],int h,int l)           //判断是否可以放皇后
{
    for(int i=1;i<h;i++)
	{
	    if(a[i]==l||abs(h-i)==abs(a[i]-l))             //判断是否行列对角线冲突 
	    {
	    	return 0;
		}
	}	
	return 1;
} 
void dfs(int t,int s[])          //放白皇后 
{
	if(t>n)
	{
		num++;
		return;
	}
	else  
	{
		for(int i=1;i<=n;i++)
		{
			if(a[t][i]==0||quenb[t]==i)     //是0或者有黑皇后就不往下; 
			{
				continue;
			}
			else if(check(quenw,t,i)==1)     //放白皇后到该位置
			{
			    quenw[t]=i;
				dfs(t+1,s);	
			} 
		}
	}
	return ;
 } 
void dfs2(int t,int s[])          //先放黑皇后再放白皇后
{
	if(t>n)
	{
		dfs(1,quenw);           //黑皇后放好后开始放白皇后
	}
	else
	{
		for(int i=1;i<=n;i++)          //放黑皇后
		{
			if(a[t][i]==0)
			{
				continue;
			}
			else  if(check(quenb,t,i))
			{
			    quenb[t]=i;
				dfs2(t+1,s)	;
			}
		}
	}
	return ;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=n;j++)
    	{
    		cin>>a[i][j];
		}
	}
	dfs2(1,quenb);            //调用函数统计
	cout<<num<<endl;
    return 0;
}
发布了6 篇原创文章 · 获赞 1 · 访问量 141

猜你喜欢

转载自blog.csdn.net/qq_46015269/article/details/105515086
今日推荐