问题描述:N皇后问题是一个古老而著名的问题,是回溯算法的典型案例。该问题由西洋棋棋手马克斯·贝瑟尔于1848年提出。在国际象棋上,N皇后问题变成了8皇后问题,著名的数学家高斯认为有76种方案,后来有人用图论的知识解出92种结果,计算机发明后,可以通过算法实现问题的求解。显然,大数学家有时候也会败在计算机面前。8皇后问题是指在8*8的棋盘上摆放8个皇后,使得任意两个皇后都不在同一行、同一列或者同一斜线上,求满足这种摆放的解为多少个。(答案是92种)
现在需要分析以下问题:
1.如何摆放才能不重复也不遗漏?
很显然,我们可以模拟手工摆放:我们逐列放皇后(从小到大逐列摆放),现在先给第一列放皇后,很显然我们会把它放在第一行,接下来,给第二列放皇后,那么第二列的皇后能放在哪些位置?这时候需要一个判断函数来判断第二列的皇后能放在那里。如果第二列找到放皇后的某一行,那么就进行第三列的摆放,这里就是递归。
如果还没有进行到最后一列的摆放时就已经不能再放皇后,那么此时需要怎么做?就返回递归的前面一次,把当前列的前面一列的皇后放在后面的行数上(从小到大逐行检验)。如果此时逐行检验已经遍历完所有的行数还是出现上面不能摆放的情况,那就在再返回上一次的递归,在进行逐行检验。这里就是回溯。
为方便描述,我们定义一个一维数组pos[i]表示皇后所在位置:设pos[i]=j,则表示第i列的皇后放在第j行上。
2.递归的终止条件是什么?