在n×n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之在同一行、同一列、同一斜线上的棋子。设计算法在n×n的棋盘上放置n个皇后,使其彼此不受攻击。
在第i行第j列放置一个皇后,那么第i行的其他位置(同行),那么第j列的其他位置(同列),同一斜线上的其他位置,都不能放置皇后。
(1)定义问题的解空间
n皇后问题解的形式为n元组:{x1,x2,…,xi,…,xn},分量xi表示第i个皇后放置在第i行第xi列,xi的取值为1,2,…,n。例如x2=5,表示第2个皇后放置在第2行第5列。
显约束为不同行。
(2)解空间的组织结构
n皇后问题的解空间是一棵m(m=n)叉树,树的深度为n。
(3)搜索解空间
· 约束条件
在第t行放置第t个皇后时,第t个皇后的位置不能和前t−1个皇后同列、同斜线。第i个皇后和第j个皇后不同列,即xi!=xj,并且不同斜线|i−j| != |xi−xj|。
· 限界条件
该问题不存在放置方案好坏的情况,所以不需要设置限界条件。
在4×4的棋盘上放置4个皇后,使其彼此不受攻击。
空间复杂度:
在所搜过程中的任何时刻,仅保留从开始结点到当前扩展结点的路径,从开始结点起最长的路径为n。程序中使用x[]数组记录该最长路径作为可行解,所以该算法的空间复杂度为O(n)。
算法优化拓展:
以上求解方法的解空间为m叉树,m=n,解空间过于庞大,所以时间复杂度很高,算法效率当然会降低。
解空间越小,算法效率越高。如果能够缩小解空间,则可以提高效率。
n皇后问题采用不同行作为显约束,隐约束为不同列、不同斜线,解空间为m叉树。4皇后问题,显约束为不同行的解空间树如图。
显约束可以控制解空间大小,隐约束用于判定可行解或最优解。如果把显约束定为不同行、不同列,隐约束为不同斜线。4皇后问题,显约束为不同行、不同列的解空间树如图。解空间变小了好多!