Skip to content

N皇后,原来如此!

今天终于把N皇后问题搞懂了。 alt text

说来惭愧,第一次听说这个经典的N皇后问题,还是在大二的离散数学课上。那时候听老师在台上讲约束条件、全排列,只觉得高深莫测,脑子完全跟着打结,真要上手写代码更是一行也憋不出来。没想到,兜兜转转,直到现在,我才算是真正地把这道题给“通关”了。

我以前的思路总是在想这里的所谓回溯,是不是要遍历每一个格子,这是个2维问题且超级麻烦。放了一个之后,剩下的格子状态该怎么更新?如果随便挑个地方放,后面全乱了怎么办?每次一想到那爆炸的组合数,我就直接觉得这题没法写。而且最重要的是LeetCode的N皇后他是个困难,这直接把我吓跑了。

但是原来所谓的回溯尝试,其实是在每一行的某个位置尝试放一个皇后,而且检测皇后位置只需要检测左上右上和正上,我们只要写个函数检测这三个方向合法那就可以视为暂时合法,逐行放直至可以有一种方法全部放下,放不下就回溯说明上一步有问题。其实说白了,这就跟我们平时做那种连环解密游戏一样:在这个房间随便找个抽屉翻个钥匙,去开下一个房间的门;要是下一个房间怎么都打不开,那就退回上一个房间,把钥匙放回去,换个抽屉再找。这是一种很朴素的人类思考方式,也就是经典的试错法,代码在自己试错。

很多算法可能都是这样吧,死磕的时候觉得像天书,等某天一个微小的观念转换过来,也就是一层窗户纸的事。感觉今天熬夜手撕这个题,睡觉都舒服了不少,咱也是手撕过N皇后的人了。

alt text