八皇后-n皇后-2n皇后

给定一个 n*nnn 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 nn 个黑皇后和 nn 个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?nn 小于等于 88

输入格式

  输入的第一行为一个整数 nn,表示棋盘的大小。

  接下来 nn 行,每行 nn 个 00 或 11 的整数,如果一个整数为11,表示对应的位置可以放皇后,如果一个整数为 00,表示对应的位置不可以放皇后。

输出格式

输出一个整数,表示总共有多少种放法。

样例输入1

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出1

2

样例输入2

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出2

0

代码: 

n皇后代码

#include <bits/stdc++.h>
using namespace std;
//   n皇后所有位置都可以放
//	 带有不能安放位置的n皇后 
int a[8][8];
int n;
int mark[8];
int cnt = 0;//计数
int judge(int row,int column)
{//判断列和斜角
	for(int i = 0; i < row;i++)
	{
		if(/*判断列*/column == mark[i]||/*判断斜角*/abs(row-i)==abs(column-mark[i]))
			return 0;
	}
	return 1;
} 
void Queue(int row)
{
	if(row == n)
		cnt++;//当找到一个解决方法时就增加
	else
	{
		for(int i = 0; i < n; i++)
		{
			if(judge(row,i) )//&&a[row][i]/*可能是当前位置存在障碍不可以放*/  /*这个就是判断当前位置能否放置
			{ //location数组标记每一列 
				mark[row] = i;//第row行的第i个放置皇后
				Queue(row+1);//每一行row在变化不存在每一行有多个皇后 故而只用判断斜角和列
			}
		}
	}
} 
int main()
{
	memset(mark,0,sizeof mark);
	scanf("%d",&n);
	//如果输入的带有不能安放皇后的棋盘
	//输入时   0代表不能安放  1代表可以安放
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			scanf("%d",&a[i][j]);
	 
	Queue(0);
	cout<<cnt<<endl;
	return 0; 
}

本题目解决代码:

#include <bits/stdc++.h>
using namespace std;
int a[8][8];
int n;
int markblack[8];
int markwrite[8];
int cnt = 0;//计数
int judgeblack(int row,int column)
{
	for(int i = 0; i < row; i++)
	{
		if(column == markblack[i]||abs(row-i) == abs(column-markblack[i]))
			return 0;
	}
	return 1;
}
int judgewrite(int row,int column)
{
	for(int i = 0; i < row; i++)
	{
		if(column == markwrite[i]||abs(row-i) == abs(column-markwrite[i]))
			return 0;
	}
	return 1;
}
int Queue(int row_black,int row_write)
{
	if(row_black == n)
	{
		//再来搜索白皇后 
		if(row_write == n)
			cnt++;
		else
		{
			for(int i = 0; i < n; i++)
			{
				if(a[row_write][i]&&judgewrite(row_write,i))
				{
					markwrite[row_write] = i;
					Queue(row_black,row_write+1);
				}
			}
		}
	}
	else
	{
		for(int i = 0; i < n; i++)
		{
			if(a[row_black][i]&&judgeblack(row_black,i))
			{
				markblack[row_black] = i;
				a[row_black][i] = 0; //存放黑皇后 后不能再存放白皇后 故令其为0
				Queue(row_black+1,row_write);
				a[row_black][i] = 1; //对应
			}
		}
	} 
}
int main()
{
	scanf("%d",&n);
	//如果输入的带有不能安放皇后的棋盘
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			scanf("%d",&a[i][j]);
	Queue(0,0);
	cout<<cnt<<endl;
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/nothing_227/article/details/81003515
今日推荐