摘自几个月前的帖子。。。
DFS模板:向深处搜索,直到找到解或者走不下去。这一般解决全排列问题

//No.1
Void DFS(deep,...{
  if(找到解 || 走不下去了){
   ......//根据题意添加
    return; 
  }
  for(扩展方式){
   if(扩展方式所能达到的状态合法){
      修改操作;//根据题意添加
      标记;
      DFS(deep+1,...);
      //根据题意是否要还原
    }  
  } 
}
//No.2
int check(参数) {
	if(满足条件)
		return 1;
	return 0;
}

void dfs(int step) {
	判断边界 {
		相应操作
	}
	尝试每一种可能 {
		满足check条件
		标记
		继续下一步dfs(step+1)
		恢复初始状态(回溯的时候要用到)
	}
}

BFS模板:通常用队列先进先出实现,解决最小时间/最小步数

void BFS(){
 初始化队列Q;
 起点S入队;
 标记S已经访问;
 while(Q非空){
   取Q的队首元素U;
   U出队列;
   if(u==目标状态){
     返回结果;
    }
   for(所有与U相邻的元素){
     if(相邻的元素合法 && 未访问){
        入队;
        标记访问;
       }
   }
 }
}