深度优先搜索dfs

一种利用函数递归枚举的方式,枚举每一个填空中所有可能的选项,然后判断这种选项是否合法。如果这个选项合法,然后继续;如果这个填空中所有的选项都不合法,那就不用继续枚举,而是去尝试更换上一个填空的选项,继续枚举。这种方法被称为回溯法。 回溯法往往会尝试一条尽可能深而完整的搜索路线,直至完全无 法继续递归时才回溯,因而需要用深度优先搜索(DFS)实现 。

回溯算法的一般形式:

void dfs(int k) { //k代表递归层数,或者说要填几个空
    if(判断空已经填完了) {
        判断最优解/记录答案;
        return;
    }
    for(枚举这个空能填的所有选项)
        if(这个选项是合法的) {
            记录下这个空(保存现场);
            dfs(x+1);
            取消这个空(恢复现场);
        }
}

例题:P2036 [COCI2008-2009#2] PERKET;P1036 [NOIP2002 普及组] 选数(含题解)

你可能感兴趣的:(c++)