回溯法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯法相关的知识,希望对你有一定的参考价值。

1.回溯实质:当把问题分解为若干步骤并递归时,如果当前步骤不满足要求,则将函数返回上一级递归调用,且相应变量一定要修改回来。

2.递归实质:满足则循环,不满足则返回并终止当前循环。

3.注意:不重复,不遗漏。

八皇后递归求解:

void search(int cur){
    if(cur==n) tot++; //递归边界。只要走到这里,皇后必不冲突
    else{
        for(int i=0;i<n;i++){
            int ok=1;
            C[cur]=i;
            for(int j=0;j<cur;j++){
                if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]){
                    ok=0;
                    break;
                }
            }//逐行放置皇后 
            if(ok) search(cur+1);
        }
    } 
}

八皇后回溯求解:

void search(int cur){
    if(cur==n)tot++;
    else{
        for(int i=0;i<n;i++){
            if(vis[0][i]+vis[1][cur+i]+vis[2][cur-i+n]==0){//主对角线标识y-x可能为负,所以+n. 
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;//vis数组表示已经放置的皇后占据了哪些列,主对角线和副对角线 
                search(cur+1);
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
            }//如果回溯法借用了辅助的全局变量,则一定要及时恢复他们 
        }
    }
}

 

以上是关于回溯法的主要内容,如果未能解决你的问题,请参考以下文章

用回溯法求01背包问题,怎样使用C++模板啊,迫切求指点!

用回溯法做0-1背包问题,这两行(程序中标注)是干嘛?为啥又要减?

回溯法八皇后问题(递归和非递归)

暴力穷举和回溯法(八皇后问题)

0-1背包问题如下,画用回溯法求解时的搜索情况,急用啊

[XJTUSE 算法设计与分析] 第五章 回溯法