八皇后问题
一些笔记
「为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。每个阶段,都会面对一个岔路口,先随意选择一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另一种走法继续走。」
反复理解下:递归是一种栈结构的形式,最后一个入栈的最先执行完,然后返回上一层栈桢继续执行(对照八皇后的代码实现)。
八皇后是怎么打印出所有的解的??
理解是
- 首先是深度有点搜索找到最优的一组解,这时候打印输出,然后递归会返回到棋盘的倒数第二行(找到解后返回和遇到错误后是一样的)。
- 然后找到下一个可能的位置,一个位置能够放置ok,那么再到下一行,找可放置的位置,如果ok,就能输出第二种解;
- 直到第七行找完,就依次找第六行,知道最后一行都找不到了,即所有解都已经找到。
代码可以看成 第一行的循环*第二行的循环*第三行的循环* … *第八行的循环
下面代码中回溯算法非常隐蔽,其实是在 result[row] = col; 这一步,每次之前的值都会被替换。
Java代码
1 | /** |
代码更加显式地展现回溯
https://www.geeksforgeeks.org/n-queen-problem-backtracking-3/
1 | /* Java program to solve N Queen Problem using |