https://blog.csdn.net/weixin_41960890/article/details/104839178?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
DFS普及组常用模板简单整理
阅读目录(Content)
- dfs框架
- dfs全排列
- dfs组合+判断素数
4.dfs排列问题
5.dfs组合问题
1. dfs框架
#include<bits/stdc++.h>
using namespace std;
int n, m;//n:有几个数 m:要几个
bool used[ ];//是否用过
int ans[ ];//答案
void dfs(int u){
if (出局判断){
//到头就走
做要做的事
return ;//退出
}
for (int i = 开始的地方; i <= n; i++)//从上一个数开始依次增加,枚举每一种情况
if (used[i] == 0) {
//判断是否用过
加入结果 设为用过
dfs(u + 1);//下一个数字
回溯:回到没用过
}
return ;//退出
}
int main(){
输入 初始化
dfs(1);//开始搜索,从1开始
return 0;
}
回到顶部(go to top)
2. dfs全排列
#include<bits/stdc++.h>
using namespace std;
int n;//有几个数
bool used[10];//是否用过
int ans[10];//答案
void dfs(int u){
//u表示上一个
if (u == n + 1){
//到头就走
for (int i = 1; i <= n; i++) printf("%d ", ans[i]);//输出*1
printf("\n");//输出*2
return ;//退出
}
for (int i = 1; i <= n; i++)//枚举每一种情况
if (used[i] == 0)//判断是否用过
{
ans[u] = i;//加入结果
used[i] = 1;//设为用过
dfs(u + 1);//下一个数字
used[i] = 0;//回溯:回到没用过
}
return ;//退出
}
int main(){
cin>>n;//输入
memset(used, 0, sizeof(used));//记得清零
dfs(1);//开始搜索,从1开始
return 0;
}
回到顶部(go to top)
3. dfs组合+判断素数
#include<bits/stdc++.h>
using namespace std;
int n, m;//n:有几个数 m:要几个
int a[30];//数字
int ans = 0;//方案个数
bool prime(int d) //素数检测
{
int s = sqrt(d);
for (int i = 2; i <= s; i++)
if (d % i == 0) return 0;
return 1;
}
void dfs(int u, int opt, int sum){
if (u == m + 1)//到头就走
{
if (prime(sum))//判断是否为素数
ans++;
return ;//退出
}
for (int i = opt + 1; i <= n; i++)//从上一个下标开始依次增加,枚举每一种情况