八皇后问题 思路

八皇后问题

要求:试编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。
提示:在国际象棋上放置皇后时,任何一个皇后的水平、竖直和斜45º都不能有另一个皇后。解决该问题采用逐次试探的方法,即采用递归调用putchess函数的方法。首先将第一个皇后放于第一行第一列,然后开始向下一行递归。每一步递归中,首先检测待放置位置是否与已放置的皇后冲突,如不冲突,则进行下一行的放置,否则,选择该行的下一个位置进行检测。如整行的位置都冲突,则回到上一行,重新选择位置。

 

 

分析:这是典型的回溯算法.从根结点开始,依次遍历所有的结点,若有一个节点错误,则说明该路径走不通,返回上一节点,以此类推,直到遍历所有节点。

     针对这一类的回溯问题,有以下步骤:

     1 定义一个解空间,该解空间至少包含一个问题的解;

     2 组织解空间;

     3 按深度优先的遍历方法进行节点搜索,在搜索执行的同时产生解空间。

 

  解题思路:

1)    要将n个皇后放到n×n的棋盘中,则每一列必须且只能放一个皇后。所以问题转化为确定皇后在每一列中的位置(在第几行上)。

2)    从第一列开始,依次考察每一列。

3)    在考察每一列的时候,总是从第一行开始,尝试将皇后放入,如果可以放入,就接着考察下一列的第一行。如果不可以放入,就接着考察这一列的下一行,直到成功,然后接着考察下一列的第一行。

4)    如果这一列的每一行都不可以放入,说明这一列前面各列的皇后放置有问题,导致这一列无法放入,需要回溯。

5)    回溯的时候,如果前面的一列每一行都已经被尝试过了,就需要接着往前回溯,直到找到还有行未被尝试过的列,然后尝试这一列的下一行。

6)    在回溯过程中经过的每一列都需要将已经放入的皇后取出来,以备后面重新选择位置放入。

7)    如果每一列都被考察完毕,即每一列中的皇后都找到了合适的位置,则找到一个解。

8)    在找到一个解后,如果还要寻找其它解,则需要回溯,尝试其它情况。

9)    当回溯到第0列时,说明1 ~ n列的所有行都已经被尝试过了,没有其它情况可以尝试,结束程序。

你可能感兴趣的:(算法,算法)