个人总结用--dfs模板-持续更新
作者:
cheems
,
2022-01-27 02:28:10
,
所有人可见
,
阅读 303
代码区1-经典模式
void dfs(int i,int j)//需要记录的数值
{
if()//限制条件,不许出界
{
/*
操作一般是记录答案
*/
return;//回溯
}
dfs(i,j+1);//往一边分支走
dfs(i+1,j);//往另一边分支走
}
代码区2-恢复现场
a[N]//目标数组或目标容器,一般用来记录状态
b[N]//判重数组或判重容器,防止未来走重
void dfs(int i,int j)
{
if()//判断停止条件
{
/*
操作答案
*/
}
for(int i=0;i<n;i++)//多分支路径
{
if(/*边界控制,剪枝*/)continue;
//判重,b[i]!=true ,没使用过
if(!b[i])
{
b[i]=true;//标记
//未来答案中的return一般是来这里
dfs(i,j+1);
b[i]=false;//恢复现场
}
}
}
代码区3-不用恢复现场
// 因为在dfs内部新建临时容器所以不需要恢复现场
a[N]//目标数组或目标容器,一般用来记录状态
void dfs(int a[],int j)
{
if()//判断停止条件
{
/*
操作答案
*/
}
memcpy(b,a,sizeof a);//辅助保存
//原始容器a,目标容器b
for(int i=0;i<n;i++)//多分支路径
{
if(/*边界控制,剪枝*/)continue;
//这里应该有些操作,赋值之类的
//未来答案中的return一般是来这里
dfs(b[],j+1);
}
}