八皇后问题

问题描述:

  根据国际象棋规则,在8×8的棋盘上,不同的皇后在同一行、同一列、或者同一条斜线上,可以相互吃掉,为了避免这种情况,请给出在该棋盘上放置8个皇后的方案有哪些。

核心问题:

  1. 判断皇后之间的位置关系是否符合要求;

  2. 如何进行问题的分解;

解决方案:

  1. 皇后之间的关系,根据不在同一行、同一列、或者同一条斜线的要求,使用x1,y1, x2, y2分别表示两个皇后的横纵坐标,可以容易地推出要求: 

    x1 != x2 && y1 != y2 && |x1 - x2| != && |y1 - y2|

  2. 根据网上的结论,这个是用回溯法。回溯法的基本原理:每次尝试向前走一步,如果不行就退回到上一步,一直尝试到一个目标解。

    放在这个题目中为:先放一个皇后,再放下一皇后,放第二个皇后时,需要根据1中的规则进行判断,如果满足则可以放置,依次进行下去。

具体的代码方案:

  比较直观的是采用递归方案,一直尝试放置皇后,一直到最后一个,到最后一个以后就可以结束递归过程,开始返回了。

  需要二维数组来记录当前可以放置的位置(如果是放置了或者被放置的皇后控制了,那么将相关位置的数值置为非0)。

待研究问题:

  1. 回溯法增加到原来的算法分类中去。

  2. 递归和迭代的区别需要仔细研究一下。

posted @ 2017-06-27 22:14  hoopoe  阅读(121)  评论(0编辑  收藏  举报