做了好多天的搜索,今天来总结下。
DFS 与 BFS
DFS:深度优先搜索:利用栈这种数据结构来实现(利用递归便于实现,但是效率较低),找到的第一个解不一定是最优解,只是先序遍历最早的可行解。
BFS:广度优先搜索:利用队列这种数据结构来实现,找到的第一个解经常都是最优解(如迷宫的最短路径),但是不常用来求所有解(重复的次优解常常都被剪枝剪掉了)。
void DFS(int y)//DFS第y行
{
if(y==n)
cnt++;
for(int i=0;i<n;i++)
if(ok(y,i)){ //判断是否越界也可以加入剪枝条件
map[y][i]=1; //放在这
DFS(y+1);
map[y][i]=0; //不放这
}
void BFS ()
{
queue Q;
Q.push(startState);//初始状态的压入
while(!Q.empty) //队列不为空
{
curState=Q.front(); //取队头
if(curState == endState) //判断是否达到终止条件
return true;
exState=extend(curState);//利用方向数组得到扩展状态
if(!mark[exState]) // 判重与剪枝
{
Q.push(exState); //将扩展状态压入