用离散数学思考八皇后问题的数据结构

本文深入探讨了八皇后问题的解决策略,重点阐述了如何利用离散数学理论构建更为简洁的数据结构,进而简化算法实现。通过将棋盘抽象为集合与函数的关系,不仅减少了代码复杂度,还揭示了数据结构与问题约束之间的内在联系。此外,文章还详细解释了如何通过数据结构自动满足问题中的约束条件,避免了手动判断重复行、列与斜线的繁琐过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

我们已经知道要用回硕法了,但是用什么数据结构去储存这个棋盘,从而使算法最简便呢。
我们首先想到的肯定是一个8*8二维数组,它显然是一个好方法,我们可以用两个二维数组,一个二维数组存皇后的位置,另外一个二维数组存0,1,判断某一行或者一列已经被占据了,然后,只要用第二个二维数组去判断就可以了。

那么有没有更好的办法呢,我们的数据结构应该尽可能的包含条件的限制,只要条件的限制就由数据结构去考虑了,而不是由我们自己去考虑。

我们用离散数学去思考问题, 我们可以吧棋盘的行看成一个集合A,列看成一个集合B,A={0,1,2,3,4,5,6,7},B = {a,b,c,d,e,f,g,h},那么8皇后的问题应该是一个关系R, 是笛卡尔乘积 A * B的子集。对于任意两个皇后都不能处于同一行、同一列或同一斜线上,也就意味着 R <= A * B &
对于任意 a1, a2 < A, R(a1) != R(a2),这样我们满足了函数(关系的子集)的一个性质,同时我们需要证明这个关系R的定义域为A,假如R的定义域不为A,也就意味着8个皇后放在了小于7的行数上,那么肯定有两个皇后在一行上,矛盾,所以R的定义域为A。那么我们可以确定R为从A到B的一个函数。

前面用的二维数组的,显然是一个关系,它没有规定两个皇后不能在同一列,而需要编程者子集去判断。而如果我们用函数来表示棋盘:
int board[8], 对于i<8, i表示函数,而Borad[i]表示皇后放在第i行的第board[i]列,board是从行到列的一个函数。那么我们不在需要判断皇后不在同一行了(函数的性质),只需要判断列和斜线,也就简化了问题。


PS:其实都是很浅显的道理,完全不需要证明,只是想说,在设计数据结构的时候,尽量让数据结构包含一些条件,而你在这个数据结构上就只需要判断剩下的条件就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值