摘要: n皇后问题的时间代价除了递归和回溯需要的外,在每一步判断加入的皇后是否与当前棋盘格局冲突也需要不少时间,guarded函数需要扫描所在列以及两条对角线。然而我们可以通过改进数据结构来使后者的时间代价降低为O(1)。
对于n皇后问题来说,每一行每一列每条对角线上最多有一个皇后,那么对于这样的每个元素(行、列或对角线)我们可以用一个bool值来表示是否已经有皇后在该元素上,这样判断是否冲突就变得十分简单,只需要读取一个bool值。另外需要记录棋盘的格局,考虑到一行只有一个皇后,可以建议一个一维数组保存每一行的皇后占用的列号。
这样基本就OK了,只是对于行而言,我们采用了回溯法(剪枝函数)保证了每行只有一个皇后,这样行的bool数组就可以省略了。
阅读全文