回溯法—八皇后问题
求解八皇后问题:
在n*n个方块排成n行n列的棋盘上,如果两个皇后位于同一行、同一列或同一对角线上,则称它们互相攻击。现在要求找出使棋盘上n个皇后互不攻击布局。
列号:(8,2,4,1,7,5,3,6)
分析:
为了找出互不攻击的布局,需要对n*n个方案进行检查,将有攻击的布局剔除掉。这是一种例举法。但这种方法对于较大的n,其工作量会急剧的增大,而逐一例举是没有必要的。
算法:
由于在第一行上的皇后在第一列,则第二行上的皇后就不可能在第一列。首先将每一行上安置一个皇后,并假设第i个皇后在第i行上,用一个一维数组queen[1..n]用于记录安放皇后的过程中随时记录第i行上的皇后所在的列号。由此可知,在这种情况下,实际上已经剔除了两个皇后在同一行的可能性。因此,在安置每一行上的皇后时,只需考虑每两个皇后不能在同一列或同一对角线上的可能性。
引进集合a,b,c分别表示各列、各条右对角线和各条左对角线上是否放置了皇后。在同一右对角线上,i-j是常量。在同一左对角线上,i+j是常量。第i行第j列上放皇后在第i-j条右对角线和第i+j条左对角线上。能放皇后时为真,不能放皇后时为假。数组queen存放各行皇后所在的列号。
从第一行(即i=1)开始布局。
设前i-1行上的皇后已布局好,即它们互不攻击。现考虑安排第i行上皇后位置,使之与前i-1行上的皇后也互不攻击。为了实现这一点,可以从第i行皇后的当前位置开始向右搜索。