【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ 洛谷 acwing

    }
}

}

int main() {
cin >> n;
dfs(1);
}


### 组合型DFS


![在这里插入图片描述](https://img-blog.csdnimg.cn/1b56bd452012433fa1d5ae290a119fc8.png)


* **与全排列的差别就是第二个for循环开始的位置,换句话说就是每个数该放什么位置。**



#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int path[N];
int n, m;

void dfs (int u, int start ) {//u:层数 start:起始的数值
if (u > m) {
for (int i = 1; i <= m; i ++ ) {
cout << path[i] << ’ ';
}
puts(“”);
}
else {
for (int i = start; i <= n; i ++) {//
path[u] = i;//表示已经填了
dfs(u + 1, i + 1);//递归下一层
path[u] = 0;//恢复现场
}
}
}

int main () {
cin >> n >> m;
dfs(1,1); //第一层开始 且从1开始枚举
return 0;
}


### 指数DFS


![在这里插入图片描述](https://img-blog.csdnimg.cn/7b0fc3540caa4727bb6b4f02cf530277.png)


* 参数 : 前u个数 选 or 不选 的
* **需要保存第x位置的状态的时候就需要用st数组来存状态**
* int st[] 0:没有遇见 1 选 2不选



#include
#include
#include
using namespace std;
const int N = 16;
int st[N];
int n;
void dfs (int u) {//u :层数
if (u > n) {//叶子结点
for (int i = 1; i <=n; i ++ ){
if (st[i] == 1) {//如果选了 就输出 1选 2不选
cout << i << ’ ';
}
}
puts(“”);
return ;
}

st [u] = 1;//选
dfs (u + 1);//递归下一层
st[u] = 0;//回溯

st[u] = 2;//不选
dfs (u+1);//递归下一层
st[u] = 0;//回溯 【恢复现场】
}
int main () {
cin >> n;
dfs(1);
return 0;
}


## 二、专题


### 烤鸡 (指数BFS)


* 每个方案有3种选择,枚举全部则有 310 种方案数  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/42da981e47944adaa2d399cfe4caaf45.png)  
 https://www
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值