首页 > 学院 > 开发设计 > 正文

基础练习 2n皇后问题

2019-11-08 02:46:06
字体:
来源:转载
供稿:网友

问题描述  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。输入格式  输入的第一行为一个整数n,表示棋盘的大小。  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。输出格式  输出一个整数,表示总共有多少种放法。样例输入41 1 1 11 1 1 11 1 1 11 1 1 1样例输出2样例输入41 0 1 11 1 1 11 1 1 11 1 1 1样例输出0

解答代码

#include<iostream>#include<string>#include<cstdio>#include<cmath>#define maxSize 128int blackFlag[maxSize];int whiteFlag[maxSize];int chessBoard[maxSize][maxSize];int counter=0;int n;using namespace std;int blackQueend(int pos);int whiteQueen(int pos);int blackQueen(int pos){	int i,j;	for(i=0;i<pos-1;i++)	{		if(blackFlag[i]==blackFlag[pos-1] || fabs(pos-1-i)==fabs(blackFlag[i]-blackFlag[pos-1]))			return 0;	}	if(pos==n)	{		counter++;		return 0;	}	for(j=0;j<n;j++)	{		if(j!=whiteFlag[pos] && chessBoard[pos][j]==1)		{			blackFlag[pos]=j;			blackQueen(pos+1);		}	}}int whiteQueen(int pos){	int i,j;	for(i=0;i<pos-1;i++)	{		if(whiteFlag[i]==whiteFlag[pos-1] || fabs(pos-1-i)==fabs(whiteFlag[i]-whiteFlag[pos-1]))			return 0;	}	if(pos==n)	{		blackQueen(0);		return 0;	}	for(j=0;j<n;j++)	{		if(chessBoard[pos][j]==1)		{			whiteFlag[pos]=j;			whiteQueen(pos+1);		}	}}int main(){	//freopen("input2.txt","r",stdin);	int i,j;		cin>>n;	//cout<<n<<endl;	for(i=0;i<n;i++)		for(j=0;j<n;j++)			cin>>chessBoard[i][j];	whiteQueen(0);	cout<<counter<<endl;	return 0;} 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表