一、问题分析
问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
要求:求解并输出八皇后问题的全部92个解。
问题分析:在处理这个问题时,首先我们要注意八个皇后的摆放位置,八个皇后不能相互攻击,也就是说一个皇后不能放到另一个皇后的攻击范围内,而且任意的两个皇后之间不能站在同一行、同一列或同一斜线上,利用计算机程序解出八皇后的92个解。
二、关键技术
(1)回溯法的概述:
求解八皇后问题所用到的关键技术就是回溯法。回溯法是基于搜索的算法,是对枚举法的改进,避免无效的搜索。回溯法实际上是一个类似穷举的搜索尝试过程,利用回溯法去不断的搜索尝试,在搜索过程中寻找解决问题的解,当发现不满足求解的要求时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以到达目标。
回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
难点:
(一)、行列如何表示:
1.先定义一个数组queen[i];
2.从第一行开始放皇后;
3.i表示第几个皇后放第几行;
4.queen[i]表示皇后在第几列;
(二)、如何表示对角线:
三、具体解法:
首先我们也是先要定义一个数组用来存放八皇后的位置,然后再定义两个变量(cnt和col)cnt用来表示摆放了几个皇后,col用来表示这一列上摆放了几个皇后。然后再(cnt,col)这个坐标里摆放皇后。然后我们开始进行判断如果第一个皇后到了第八列的位置且第二个皇后已经到了第六列的位置,已经摆放不下皇后,那么就推出循环。然后就是判断皇后会不会相互攻击,如果能相互攻击到,那我们就用1表示,如果不能攻击到就用0表示
如果判断的结果为0,那么表示这个位置可以摆放皇后,记录下当前皇后的位置,开始摆放下一个皇后,下一个皇后接着从第一行开始遍历,如果摆满了八个皇后,就打印输出八个皇后的摆法,然后将八个皇后全部撤回,从下一行开始遍历,寻找新的位置,如此循环往复,直到解出所有的解法。
四、算法测试结果: