八皇后问题(书本p249)

戏子无情 提交于 2020-02-06 00:37:05

如果在同一列,列号一样;同一行,行号一样;
如果在/左斜线上,行列之和一样;
如果在\右斜线上,行列之差一样

#include<iostream>
using namespace std;
bool d[17] = { 0 }, b[9] = { 0 }, c[17] = { 0 };//b用来判断列有没有被占领
//c是c和d都是斜方向上的线
int sum = 0, a[9];//表示皇后的位置
void search(int i)
{
	int j;
	for(j=1;j<=8;j++)
		if ((!b[j]) && (!c[i + j]) && (!d[i - j + 7]))//如果列未占领&&
		{
			a[i] = j; b[j] = 1;
			c[i + j] = 1;
			d[i - j + 7] = 1;
			if (i == 8)//摆放完了就输出呗
			{
				int j;
				sum++;
				cout << "sum=" << sum << endl;
				for (int j = 1; j <= 8;j++)
					cout << a[j] << " ";
				cout << endl;
			}
			else
				search(i + 1);
			b[j] = 0; c[i + j] = 0; d[7 + i - j] = 0;//**回溯!**
		}
}
int main()
{
	search(1);//从第一个皇后开始放。
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!