search

先挂一个链接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;
}

总的来说,搜索不是简单看看书做做例题就能熟练掌握的,但搜索又是一种不那么复杂的算法。想学好搜索,只能通过多加练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值