8皇后问题

八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例.

时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题,

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。
#pragma warning(disable:4996)
#include<iostream>
using namespace std;
int ans;
bool col[8],x1[15], x2[15];                                //col为列标记,x1,x2为两条对角线标记,每种对角线各15条
bool check(int r, int i)                                   //检测是否合法
{
	return !col[i] && !x2[r-i+7] && !x1[r+i];
}
void dps(int r)
{
	if (r == 8)                                           //行走到8,表示方案可行
	{
		ans++;
		return;
	}
	for (int i = 0; i < 8; i++)                           //遍历当前行的每一列
	{
		if (check(r, i))
		{
			col[i] = x1[r + i] = x2[r - i + 7] = true;    //对当前位置列和两对角线做上占用标记
			//对于x1, 某个格子上对角线行列之和固定, 对于x2, 某个格子上对角线行列之差固定
			//x2中+7是防止数组下标为负数
			dps(r + 1);                                   //遍历下一行
			col[i] = x1[r + i] = x2[r - i + 7] = false;   //取消当前位置列和两对角线的标记
		}
	}
}
int main()
{
	dps(0);
	cout << ans << endl;                                  //输出结果
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值