N皇后问题

题目要求

在n*n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。

输入格式    :4

输出格式    :2

题目分析
一、对于n皇后这个棋盘,有这些规则

      1.不能同一行

      2.不能同一列

      3.不能在同一斜线上

正常情况下,对于一个棋盘,我们都会使用二维数组

但是对于这个游戏规则,使用一维数组就行,因为每一行只能放一个棋子,即按行放皇后。

二、对于这三个规则,所以我们的核心层就应该有两个判断(使用一维数组,不用考虑行上的问题)  

     1. 当前皇后位置与之前已经放好的皇后是否在同一列,是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。

     2.  当前皇后位置与之前已经放好的皇后是否在同一斜线上(即45°或135°),是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。

三、非递归求解N皇后问题

//N皇后问题——非递归
#if 1
#include
#define N 6
using namespace std;

int q[N + 1];//存储皇后的列号,q[i]表示第i个皇后在第i行上的第q[i]列。

int check(int j)//检查第j个皇后的位置是否合法
{
	int i;
	for (i = 1; i < j; i++)
	{
		if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))//判断皇后j和皇后i是否在同一列或者同一斜线
		{
			return 0;
		}
	}
	return 1;
}

void queen()//求解N皇后的方案
{
	int i;
	for (i = 1; i <= N; i++)
	{
		q[i] = 0;//初始化,把N个皇后的位置都设为0
	}

	int answer = 0;//方案数

	int j = 1;//表示正在摆放第j个皇后
	while (j >= 1)
	{
		q[j] = q[j] + 1;//让第j个皇后向后一列

		while(q[j] <= N && !check(j))//判断第j个皇后的位置是否合法
		{
			q[j] = q[j] + 1;//不合法就往后一个位置摆放
		}
		if (q[j] <= N)//表示第j个皇后找到的位置合法
		{
			if (j == N)//找到了N皇后的一组解
			{
				answer = answer + 1;
				cout << "方案" << answer << ": ";

				for (i = 1; i <= N; i++)
				{
					cout << q[i] << " ";
				}
				cout << endl;
			}
			else//摆放下一个皇后
			{
				j = j + 1;
			}
		}
		else//表示第j个皇后没有找到合法的位置
		{
			q[j] = 0;//还原第j个皇后的位置
			j = j - 1;//回溯
		}
	}
}

int main()
{
	queen();
	system("pause");
	return 0;  
}
#endif

四、递归求解N皇后问题

//N皇后问题——递归
#if 1
#include
#define N 6
using namespace std;

int answer = 0;//方案数 
int q[N + 1];//存储皇后的列号,q[i]表示第i个皇后在第i行上的第q[i]列。

int check(int j)//检查第j个皇后的位置是否合法
{
	int i;
	for (i = 1; i < j; i++)
	{
		if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))//判断皇后j和皇后i是否在同一列或者同一斜线
		{
			return 0;
		}
	}
	return 1;
}

void queen(int j)//求解N皇后的方案
{
	int i;
	for (i = 1; i <= N; i++)//尝试将皇后j放在第i列
	{
		q[j] = i;

		if (check(j))
		{
			if (j == N)
			{
				answer = answer + 1;
				cout << "方案" << answer << ": ";


				for (int k = 1; k <= N; k++)
				{
					cout << q[k] << " ";
				}
				cout << endl;
			}
			else
			{
				queen(j + 1);//递归摆放下一个皇后的位置
			}
		}
	}
}

int main()
{
	queen(1);
	system("pause");
	return 0;
}
#endif

 
 

你可能感兴趣的:(c++,学习,开发语言,visualstudio,算法)