n 皇后问题的递归回溯解法其实就是个“找家”的过程

N皇后问题的递归回溯解法其实就是个“找家”的过程。大家都知道,在这n×n的棋盘上,要放n个皇后,“躲”过彼此的威胁是关键,也就是不能有任何两个皇后在同一行、同一列或者同一条斜线上打架。 具体操作分几步来走。首先得从第一行下手,随便找个位置把第一个皇后摆上去,这时候反正没有约束,只有一种放法。接下来轮到第二行,得像“躲猫猫”似的挨个空格去试,把之前用过的行号记下来,如果位置冲突了就跳过。找到一个安全的地儿,第二行就算“安顿”下来了。 真正的考验往往在第三行,要是找来找去都没地方塞,系统就得把上一行的皇后给“挪”到下一个不冲突的格子继续试。要是还不行,就得一层一层往回倒带,直到在前面的某一行找到新的出路或者所有可能性都用光了才算完。后面的第四行往后也是一样的套路:每放一列就得检查全局是否安全;一旦发现死路,就把上一行的皇后重新挪动位置;要是这也不成,继续往上回溯直到顶层。 等到最后一行也顺利放上皇后的时候,系统就会从最深的层回溯回到最顶层,打印出一个合法的解。要是一直回溯到第0行(理论上不存在)还没找到解,那就说明这棋盘太小放不下n个皇后,程序只能宣布“无解”。 看下面这张图就能更直观地看到整个过程——每一步的状态变化都清清楚楚。比如第一步轻松把第一个皇后放在第一行的第一个位置;到了第三步的时候发现第三行卡住了,这时候系统就会把第二行的皇后给挪开重新找位置;第五步的时候第四行又不行了,就得一直回溯到第一行去折腾。 大家会发现每一次后退其实就是递归退出又重新进入的过程;等所有的皇后都稳稳当当坐好的时候,这棵搜索树就算是彻底走通了。