基本概念
状态:对问题在某一时刻的进展情况的数学描述
状态转移:从一个状态扩展出其他状态的过程
搜索树:由若干状态和状态转移形成的树形结构
判重:已经搜索过的状态不再进行搜索
剪枝:去掉搜索树中不需要的状态和转移
深度优先搜索 DFS
以递归的方式寻找路径,走不通就返回上一层。
时间复杂度:O(xnm),x为可扩展方式的种数
空间复杂度:O(n*m)
伪代码框架
void dfs(当前状态)
{
if(达到目标状态)
{
...
return;
}
for(遍历下一层状态)
{
...
dfs(下一层状态);
...
}
}
广度优先搜索 BFS
按状态的层次扩展,距根结点越近的状态越先扩展
第一次到达某结点状态所需步数一定为最少步数
由于只需知道第一次到达某状态的情况,需要判重
实现方法:队列
时间复杂度:O(n*m)
空间复杂度:O(n*m)
伪代码框架
void bfs(初始状态st)
{
定义当前和下一个状态;//node cur,nex;
初始化操作(vis数组及其他初始化);
新建队列q;//queue<node>q;
步数清零;//cur.step=0;
初始状态st入队;//q.push(st);
标记访问;//vis[]=1;
while(!q.empty())
{
取出队首状态;//cur=q.front();
出队;//q.pop();
if(到达目标状态) {跳出循环;}
for(遍历下一层状态)
{
if(该状态未被访问) 入队;
//if(!vis[]) vis[]=1;q.push(nex);
...
}
}
}