深搜递归状态压缩算法-CSDN博客

20 阅读1分钟

在这里插入图片描述

# include <stdio.h>
# include <math.h>
# include <string.h>
#define N 15
///深搜递归状态压缩算法
int n;
int st[N] ;///数据最大范围.记录每个位置当前状态:0表示还没考虑,1表示选择它,2表示不选它

void dfs(int u){

    if(u==n){///遍历到每棵分支的边界,退出循环
        int i;
        for(i=0;i<n;i++){///遍历到每棵分支的边界
        if(st[i]==1){///1表示打印选择的
        printf("%d ",i+1);
        }

    }
     printf("\n");
        return;
    }
    st[u]=2;///第一个分支,不选它
    dfs(u+1);///先递归进入每个分支的末节点.之后向根部回溯
    st[u]=0;///   恢复现场

    st[u]=1;///第一个分支,选它
    dfs(u+1);
    st[u]=0;///恢复现场



}


int main(){
    scanf("%d",&n);
    dfs(0);///从零开始遍历
    return 0;
}