题目
思路
首先想到广度优先搜索(BFS)与深度优先搜索(DFS),要背下BFS与DFS,往上面套就行。
BFS与队列相匹配,DFS与栈相匹配。
BFS模板:
queue<int> Q;
int visited[N + 1] = { 0, };
Q.emplace(第一个元素);
while(!Q.empty()){
int x = Q.front();
Q.pop();
//在此处添加出队列后的操作
visited[x] = 1;
//
for(int i...与当前元素相关的入队的个数){
if(!visited[i] && 条件){
//在此处添加入队列后的操作
visited[x] = 1;
//
Q.emplace(i);
}
}
}
DFS模板:
非递归借助栈
void dfs()//参数用来表示状态
{
if(到达终点状态)
{
...//根据题意来添加
return;
}
if(越界或者是不符合法状态)//剪枝
return;
for(扩展方式)
{
if(扩展方式所达到状态合法)
{
....//根据题意来添加
标记;
dfs();
修改(剪枝);
(还原标记);
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
}