回溯

回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的。回溯法可以被认为是一个有过剪枝的DFS过程。把问题分解成若干步骤 并递归求解时如果当前步骤没有合法选择 则函数返回上一级递归调用 这种现象叫做回朔

回溯的一般结构:

void dfs(int 当前状态){
          if(当前状态为边界状态){
            记录或输出
            return;
          }
          for(i=0;i<n;i++){     //横向遍历解答树所有子节点
               //扩展出一个子状态。
               修改了全局变量
               if(子状态满足约束条件){
                  dfs(子状态)
               }
                恢复全局变量//回溯部分
            }
    }

8 皇后问题

#include "stdio.h"
#define N 8
int n = N;
int ans = 0;
int C[N];
void f(int cur){
    if(cur == n)    {
        ans++;
    
        for( int i = 0; i<N ;i++){
            int x = C[i];
            for (int j = 0; j < N; j++) {
                if(x == j){ printf("1 ");continue;}
                printf("0 ");
            }
            printf("\n");
        }
    printf("\n");printf("\n");
    }
    
    for(int i = 0;i < n; i++){
        int ok = 1;
        C[cur] = i  ; //cur 行 放 第 i 列
        for(int j = 0; j < cur; j++)//列数在变     /****对于坐标(x,y)与(m,n)若在主对角线上 y-x = n-m 副对角线 y+x = m+n *****/
            if( C[cur] == C[j]/*是否同一列*/ || cur - C[cur] == j - C[j] /*检查主对角线*/ || cur + C[cur] == j + C[j] /*副对角线*/){//按行放置不用检查行
                ok = 0; break;//不符合
        }
        if(ok) f(cur+1);//若合法 继续 下一行放置
    }
}

int main(){
    f(0);
    printf("%d\n",ans);
    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,728评论 0 89
  • I. 回溯算法基础 回溯与递归的区别和联系  很多人不理解回溯与递归到底是什么关系。其实很简单,回溯算法是一种算法...
    偏偏注定要落脚丶阅读 4,723评论 2 8
  • 1.基本概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件...
    RavenX阅读 8,314评论 1 2
  • 套路很深,就是遍历全部情况 定义解空间,包含全部解 利用深度优先搜索解空间 Trial,减枝。(避免访问不可能产生...
    superlj666阅读 501评论 0 0
  • 回溯法是的应用范围很广,主要用于数据量不是很大的暴力求解问题,比如"图的m着色问题","八皇后问题"。 ...
    岳林安阅读 728评论 0 1