八皇后问题
问题描述:
根据国际象棋规则,在8×8的棋盘上,不同的皇后在同一行、同一列、或者同一条斜线上,可以相互吃掉,为了避免这种情况,请给出在该棋盘上放置8个皇后的方案有哪些。
核心问题:
1. 判断皇后之间的位置关系是否符合要求;
2. 如何进行问题的分解;
解决方案:
1. 皇后之间的关系,根据不在同一行、同一列、或者同一条斜线的要求,使用x1,y1, x2, y2分别表示两个皇后的横纵坐标,可以容易地推出要求:
x1 != x2 && y1 != y2 && |x1 - x2| != && |y1 - y2|
2. 根据网上的结论,这个是用回溯法。回溯法的基本原理:每次尝试向前走一步,如果不行就退回到上一步,一直尝试到一个目标解。
放在这个题目中为:先放一个皇后,再放下一皇后,放第二个皇后时,需要根据1中的规则进行判断,如果满足则可以放置,依次进行下去。
具体的代码方案:
比较直观的是采用递归方案,一直尝试放置皇后,一直到最后一个,到最后一个以后就可以结束递归过程,开始返回了。
需要二维数组来记录当前可以放置的位置(如果是放置了或者被放置的皇后控制了,那么将相关位置的数值置为非0)。
待研究问题:
1. 回溯法增加到原来的算法分类中去。
2. 递归和迭代的区别需要仔细研究一下。