先挂一个链接https://www.61mon.com/index.php/archives/212/
就拿noip来说吧,哪一个题不可以用搜索来拿分?我有很多学长只学了很短时间的计算机,有时候他们复赛前只会模拟和搜索,但他们依旧可以拿1=。搜索作为暴力(非完美算法)里最重要的一环,本质上就是通过计算机的运算能力不断尝试不同路径来求解。很多算法也需要搜索的过程。搜索不光考验码力,也十分考验智力,集中力,意志力。学好搜索才能应对更好的算法。其实其他算法不就是换了一种方式搜索吗。
dfs
dfs有一个回溯的过程,需要在使用一个状态,改状态,再把状态改回来。具体就是设置边界条件,走不通自然就需要回溯。dfs用递归实现,不想递归的话https://www.zhihu.com/question/22985195飞起。
比如说迷宫,用dfs实现的话,就可以在for循环里面写上分别代表不同路径的if:if怎么怎么样就递归,那么dfs的过程会是先走完一条路,在不停的返回前面有多种子状态的状态,就像在树枝上,先直直的走完一条枝子,在返回枝杈走另一条枝子。
比如说迷宫(用bfs更好)的dfs做法,就是不停地尝试各种路径,如果能走到终点,就记录答案。
再比如八皇后,也是用搜索不同的状态求解。枚举第一行皇后的位置,通过第一行皇后的位置这个状态来尝试其他皇后的放置位置。
void dfs(int depth)
{
if(depth == n)
{
return;
}
for(int i = 0;i < n;i ++)
{
dfs(depth + 1);
}
}
bfs
bfs借助队列实现,因为bfs需要处理分层扩展,每一次扩展出新的一层,上一层的节点弹出,(因为不再需要记录,弹出以节省空间),真正重要的过程就是通过层级遍历,求解,通常用bfs处理最优解。
queue<int>q;
void bfs()
{
q.push();
while (!q.empty())
{
int s = q.front();
q.pop();
if()
{
return;
}
for(int i = 0;i < n;i ++)
{
int s;
q.push(s);
}
}
return noanswer;
}
总的来说,搜索不是简单看看书做做例题就能熟练掌握的,但搜索又是一种不那么复杂的算法。想学好搜索,只能通过多加练习。