回溯法
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; }//如果回溯法借用了辅助的全局变量,则一定要及时恢复他们 } } }
以上是关于回溯法的主要内容,如果未能解决你的问题,请参考以下文章