DFS模板
int search(int t)
{
if(满足输出条件)
{
输出解;
return;
}
else
{
for(int i=1;i<=尝试方法数;i++)
if(满足进一步搜索条件)
{
为进一步搜索所需要的状态打上标记;
search(t+1);
恢复到打标记前的状态;//也就是说的{回溯一步}
}
}
}
注意
1.第一个if是符合输出解的条件,第二个if是符合进一步搜索的条件;
2.下一步搜索时,不是使用return search(t+1),而是直接search(t+1);(新手可能会注意不到这个关键的地方,以至于每次写完不知道为什么只得到一个答案就返回主程序了)
3.for循环之后的if可以是多个;
4.for循环边界,例如:
-
方向是四个,那么边界肯定就是4;(帖主用3,是因为从0开始的)
-
素数环需要尝试1至20,那么边界就是20;
例题1
洛谷 P2089 烤鸡
思路
∑ i = 0 9 a i = 10 ( 1 ) \sum_{i=0}^{9} a_{i} = 10 \quad\quad\quad(1) i=0∑9ai=10(1)
其中,
1 ≤ a i ≤ 3 1 \leq a_{i} \leq 3 1≤ai≤3
试求满足(1)式的方案数。
坑
方案数可达到 1 0 3 10^3 103 数量级,因此记录结果的数组要开到10000
C++代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <string>
#include <vector>
using namespace std;
const int maxn = 10000;
int a[maxn][15];
int mem[10];
int cnt;
int n;
void dfs(int t,