码迷,mamicode.com
首页 > 其他好文 > 详细

回溯法

时间:2016-04-06 00:17:45      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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;
            }//如果回溯法借用了辅助的全局变量,则一定要及时恢复他们 
        }
    }
}

 

回溯法

标签:

原文地址:http://www.cnblogs.com/wqkant/p/5357402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!