八皇后问题__剪枝

八皇后问题__剪枝

问题介绍:
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上
输入:

输出:
共n+1行
第一行输出八皇后解的个数n,
后续的n行按照字典序输出所有解决方案,每种方案占一行。
i表示第i行,ai代表第i行的第ai个位置放置一个皇后

#include
#include
#include
#include
using namespace  std;
vector<vector<int> >G;
vector<int>R;
void solve(int n)
{
     
	if (n == 8)
	{
     
		G.push_back(R);//已经迭代到第九层,说明前八层相互不冲突,是一个可行解,将R加入到G中
		return;//前八层迭代已结束,停止递归
	}
	for (int i = 0; i < 8; i++)//对第n层的8个位置进行检验,检验是否与之前的皇后有冲突
	{
     
		bool flag = false;
		for (int j = 0; j < R.size(); j++)
		{
     
			if (i == R[j])
			{
     
				flag = true;//之前的第j层中有位于同一列的皇后,该解废除
			}
			if (abs(R[j] - i) == abs(j - n))
			{
     
				flag = true;//有位于同一斜线上的皇后,该解废除
			}
		}
		if (flag)
		{
     
			continue;//已知在第i个位置上放置皇后会造成错解,continue去测试下一个位置
		}
		else
		{
     
			int t = R.size();//记录R的大小,方便后续的抹除
			R.push_back(i);//已知第i个位置和之前的皇后不冲突,将i加入到R中
			solve(n + 1);//继续递归下一层
			R.erase(R.begin() + t, R.end());//将本次循环和递归加入的皇后的位置抹除,以便不影响下一轮循环
		}
	}
}
void out(int t)
{
     
	cout << t << ' ';
}
int main()
{
     
	solve(0);
	cout << G.size() << endl;//输出解的个数
	for (int i = 0; i < G.size(); i++)
	{
     
		for_each(G[i].begin(), G[i].end(), out);
		cout << endl;
	}

}

你可能感兴趣的:(文章,算法,数据结构,剪枝,stl)