当问题说到一共有n个数/n个选择,且按顺序依次选择时,一般都会用到这样的dfs模板
dfs(index,state){
if(index==n)return;
if(state not valid)cut;
for(choice):
dfs(index+1,f(state,g(index)));
}
比如说8皇后问题:从8行依次做出选择,选择8次。状态参数为vis标记。
等等........
下面说说我对这个模板的理解:
首先,if放在dfs前面,就是说在选择之前就做了判断,这是什么意思呢?
(1)每一次dfs时,index总是增1,因为dfs调用的本质是做了一次选择,所以index参数可以理解为做选择的次数。当index传入0时,因为要做n次选择,所以index==n时才会return,而不是在n-1时return
(2)如果传入0,那么if判断时,选择的次数是已经选择的下标+1。因为下标0也算一次选择,所以下标0选择完后,在if判断时index为1,以此类推。
(3)状态参数就是做了index次选择后的状态。因为状态参数在做选择的时候更新,所以在if判断
时,对应的状态就是做了index次选择的状态(index初始传入0)
(4)因为在没有改变参数的值,所以这个模板自带回溯功能。
扫描二维码关注公众号,回复:
13778107 查看本文章
做了3次选择后,if判断时,index为3,下标为2的已经做完选择,状态参数是0~2状态。