C.就来谈谈深搜与广搜

搜广推面试:从机器学习基础到系统架构的实战指南 机器学习与深度学习是人工智能的核心基石,其原理在于通过数据驱动的方式让计算机自动学习规律。理解模型结构、优化算法与损失函数的设计,是实现精准预测和智能决策的技术关键。在搜索、广告、推荐等大规模工业场景中,这些技术的价值在于将复杂的用户行为与业务目标转化为可建模、可优化的工程问题。例如,通过因子分解机(FM)等模型处理稀疏特征组合,或利用双塔模型进行高效的向量化召回,都是解决海量数据下精准匹配的典型应用。本文聚焦于搜广推领域的面试实战,系统梳理了从机器学习基础、排序模型原理到推荐系统架构与特征工程的完整知识体 阅读详情

C.深搜与广搜的基础代码实现

下面以一道简单的搜索算法题为例:
在一个,迷宫中寻找出口,并且要求路径最短。且迷宫中有障碍物不能穿过,并由规定起点出发。输入包括三部分,第一行:迷宫的尺寸大小。
第二行:定义迷宫。 第三行:起始位置和出口所在。

深搜代码实现部分:

#include<stdio.h>
int n,m,p,q,min=9999;
int a[51][51],book[51][51];//a用来储存迷宫,book用来记录已走过的路径。
int sum;//记录所有出口的方式。
void dfs(int x,int y,int step);//深搜函数。
int main()
{
    int i,j,startx,starty;
    scanf("%d %d",&n,&m);//输入迷宫大小。
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        scanf("%d",&a[i][j]);//编辑迷宫。
    scanf("%d %d %d %d",&startx,&starty,&p,&q);//初始坐标和出口赋值。
    book[startx][starty]=1;//初始坐标已走过避免再次搜索。
    dfs(startx,starty,0);//传递参数。
    printf("%d\n",min);
    printf("%d\n",sum);
    system("pause");
    return 0;
}
void dfs(int x,int y,int step)
{
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//分别定义上下左右四个方向。
    int tx,ty,k;//[tx][ty]表示下一步坐标,k为了遍历所有方向
    if(x == p && y == q)//判断是否为出口
    {
        if(step < min)
        {
            min = step;//更新最短路径
        }
        sum++;//找到出口sum+1
        return;
    }
    for(k=0;k<=3;k++)
    {
        tx = x + next[k][0];
        ty = y + next[k][1];
        if(tx < 1 || tx > n || ty < 1 || ty > m)//如果越界不再进行下一步,直接寻找其他未越界的方向
        {
            continue;
        }
        if(a[tx][ty] == 0 && book[tx][ty] == 0)//判断该方向是否可以继续行走
        {
            book[tx][ty] = 1;//记录当前坐标已走过
            dfs(tx,ty,step+1);//在当前基础上进行下一步搜索
            book[tx][ty] = 0;//遍历过该方向便收回以方便其左边搜索时可以行走
        }
    }
    return;
}

以上为深搜的实现代码,带有注释应该是不难理解的。那么下面就来看看广搜吧,并从中发现他们的不同所在吧。

广搜代码实现部分:

#include<stdio.h>
struct note//队列
{
    int x;//横坐标
    int y;//纵坐标
    int f;//父节点(上一个结点)
    int s;//步数
};
int main()
{
    struct note que[2501];//定义队列
    int a[51][51]={0},book[51][51]={0};//定义迷宫数组,book用于记录哪些点已遍历过
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//分别代表向右,想下,向左,向上
    int head,tail;//head表示正扩展的结点,tail位于队尾最后一个元素的后面随时将head扩展出来的结点入队
    int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;
    scanf("%d %d",&n,&m);//迷宫规格
    for(i = 1;i <= n;i++)
        for(j = 1;j <= m;j++)
        scanf("%d",&a[i][j]);
    scanf("%d %d %d %d",&startx,&starty,&p,&q);//起点,终点
    head = 1;
    tail = 1;
    //将初始入口入队
    que[tail].x = startx;
    que[tail].y = starty;
    que[tail].f = 0;
    que[tail].s = 0;
    tail++;//每执行一次入队就后移一位
    book[startx][starty] = 1;//起点已到达过
    flag = 0;//如找到终点即flag=1,现在表示未找到终点
    while(head < tail)//队列不为空
    {
        for(k = 0;k < 4;k++)//枚举4个方向
        {
            tx = que[head].x + next[k][0];
            ty = que[head].y + next[k][1];
            if(tx < 1||tx > n||ty < 1||ty > m)//判断是否越界
                continue;
            if(a[tx][ty] == 0 && book[tx][ty] == 0)//判断是否为障碍,是否已经走过
            {
                book[tx][ty] = 1;//记录当前节点已走过,广搜每个节点只搜索一次,所以之后不需要再次置零
                que[tail].x = tx;
                que[tail].y = ty;
                que[tail].f = head;
                que[tail].s = que[head].s + 1;
                tail++;//没入队一次tail++
            }
            if(tx==p && ty==q)//是否找到出口
            {
                flag = 1;
                break;
            }
        }
        if(flag == 1)
            break;
        head++;//当前节点的扩展未有找到出口,搜索下一个节点
    }
    printf("%d\n",que[tail - 1].s);//因为tail指向队尾最后一个元素的后一位
    system("pause");//程序运行完毕,暂停检查数据
    return 0;
}

以上就是两种搜索的基本实现,从中不难看出:
深搜是属于“不撞南墙不回头”?这么说应该对的哈。总之,深搜大抵就是,有一个结点开始,选择一条分支进行深搜,当遇到下一结点重复上述步骤,知道这一分支被搜索完毕,然后再从搜索完的最下面的结点,向上回溯,如果还有其他选择,在对其他选择进行搜索。大体流程就是这样,从树的根部搜索到最末尾的分支,然后,一个节点搜索完毕后,回溯,再搜索,知道在回溯到树的根部,再由树的根部发出另一分支。搜索到目标则停止。
广搜就有别于深搜,广搜是向外发散式的搜索。就像Wi-Fi的图标,大家都是熟悉的吧,由树的根部也就是Wi-Fi的那个点一层一层的向外发散,搜索完一层,再进入下一层,直至到达最后一层。相对于深搜来说,他更显得盲目。但却并不花费更多时间,相对来说,深搜更加浪费时间。

写在最后

搜索题大体都是这样的模板,如果遇到问题仔细考虑,判断用什么搜索方法。祝愿各位奋斗在C代码海洋的同胞们有心人终成正果。

                                                                泪目°
谈谈memcpy函数的优化(纯C) 在使用C语言编程时,我们常用memcpy来复制内存数据,但很少有人会关注到memcpy怎么实现。最简单的memcpy功能实现如下: void *low_memcpy(void *dst, const void *src, size_t length) { char *srcp = (void*)src; char *dstp = (void*)dst; char *tail = srcp + length; while(srcp < tail) *dstp 阅读详情

相关推荐

AD24层次原理图设计避坑指南:如何解决端口连接与自动交叉引用问题

本文深入解析AD24层次原理图设计的核心机制,聚焦端口连接错误、自动交叉引用干扰等常见问题。通过对比自上而下与自下而上设计流程,提供端口类型匹配、命名规范等实用解决方案,并指导如何关闭烦人的红色框线视觉干扰,帮助工程师高效避坑,实现复杂系统的模块化设计。

wdx01234567的博客 615

深度搜索模板

【代码】深度搜索模板。

zyy_289的博客 392

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1169

简单深搜模板

【代码】简单深搜模板。

j164548848645的博客 782

从零开始玩转机械臂:用Matlab+Robotics Toolbox实现四自由度机械臂运动仿真

本文详细介绍了如何利用Matlab及其Robotics Toolbox工具箱,从零开始构建并仿真一个四自由度机械臂。通过D-H参数建模、正向运动学验证、交互式操控以及轨迹规划等实践步骤,帮助初学者在虚拟环境中直观理解机器人运动学核心概念,为后续硬件实现奠定坚实基础。

weixin_29055699的博客 324

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发进程渐渐成为了当前科技领域的热点。全球各国已纷纷将目光投向了充满想象的6G时代。本文将探讨全球6G技术研发的最新进展,以及6G技术的核心创新与潜在应用。

fiberroad的博客 2424

pta 7-5 迷宫-深度策略

程序设计竞赛引导(选修课)老师布置的作业。第一次独立写出来DFS,挺开心的,这个题和常规的DFS还不太一样。写了一晚上,另外还学会了动态分配数组大小。认识到了自己在堆空间分配线性地址这个想法的局限性。 一个陷入迷宫的老鼠如何找到出口的问题。老鼠希望系统性地尝试所有的路径之后走出迷宫。如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向八个方向 运动,顺序是从正东开始按照顺时针进行。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”。迷宫只..

u013677637的博客 4637

软考中级-软件设计师 Python基础

软考中级-软件设计师 Python知识点整理

片言可决讼,半纸能缚龙 3641

深搜(dfs)和广搜(bfs)

深搜(dfs)和广搜(bfs) 广搜可以用来解决最小路径问题和连通性问题 深搜可以解决连通性问题 实现方式 深搜用函数递归实现 广搜用队列实现 问题 输入地图判断连通性和最小路径,每次只能走上下左右,S为起点,T为终点,#为障碍物,.可以走,如以下地图: S… ###… … .###. …T. 深搜代码如下 #include <iostream> using namespace std; int n, m, sx, sy; char mmap[105][105]; int dir[4

R0Y0R的博客 1940

VS code 调试显示preLaunchTask“g++“已终止,退出代码为-1。 生成‘... .exe‘文件错误

总结: 以后每个工程都需要按照这样的流程:创建一个.c/.cpp文件 -> F5运行 -> 配置tasks.json文件-> launch.json文件 -> 运行

qq_45151652的博客 2513

YOLOv13添加WDBB模块,map提升5.34!!,召回率提升6.55,准确率提升3.23

本文提出了一种基于YOLOv13改进的目标检测模型,通过引入WDBB模块显著提升了检测性能。实验结果表明,添加WDBB模块后,mAP提升11.34,召回率提升14.55,准确率提升3.23。文章详细介绍了模型移植方法,包括创建新的yaml配置文件、修改tasks.py和__init__.py文件,以及实现rep_block.py中的核心转换函数。改进后的模型通过深度卷积、通道注意力等模块优化了特征提取能力,同时保持了轻量化的特点。该工作为YOLO系列模型的性能提升提供了新的思路和技术实现。

FJN110的博客 2623

深搜代码加注释

【代码】深搜代码加注释。

panhz的博客 214

大模型多智能体协作面试题及参考答案

在多智能体系统里,代理定义自身目标或效用函数的过程与系统架构、应用场景紧密相关。从本质上讲,目标是代理行为的导向,而效用函数则是对目标达成程度的量化评估。代理通常依据自身角色、系统全局需求以及与其他代理的交互关系来确立目标。比如在合作型 MAS 中,代理目标可能需要与全局目标对齐,像多个物流机器人协作完成货物配送时,每个机器人的目标会围绕 “高效完成分配任务”“避免路径冲突” 等展开,其效用函数可能涉及任务完成时间、能耗等指标的加权求和。目标定义的方式存在多种类型。

大模型大数据攻城狮的专栏 1022

谈谈JVM-深堆、浅堆

浅堆表示一个对象结构所占用的大小(对象头+实例数据+对齐填充,不包括内部引用 对象大小) 深堆表示一个对象被 GC 回收后,可以真实释放的内存大小(保留空间) 对象 对象 = 对象头 + 实例数据 + 对齐填充 对象头 对象头 = 标记部分 + 原始对象引用 标记部分包括 hashcode、gc 分代年龄、锁状态标志、线程持有锁、偏向线程锁id,偏向时间戳,这一部分在32位机器上为 4 byte,...

Formor_的博客 873

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深搜——棋盘问题(poj1321)

题目 传送门 棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 87409 Accepted: 40316 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行...

weixin_44554979的博客 335

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

谈谈重定向、管道与C

谈谈重定向、管道与C我所知道的重定向和管道就这些了,写了一早晨终于写完了,现在接着睡,希望对大家有用。这是我学习之中知道的一些关于重定向和管道的知识,并积累的资料,在这里和大家分享。如果说的有不足和错误的地方,请指出。毕竟是交流信息。我这里是从DOS和C语言方面看它,没有太多涉及LINUX中所说的。我想从以下几个方面叙述:一、 重定向:所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标

genghaiyang的专栏 1052

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

谈谈C语言的溢出

溢出是C语言中最常见的漏洞。最常见的溢出包括数组溢出、数溢出、缓冲区溢出、指针溢出以及栈溢出,下面笔者就对这些溢出做一个总结归纳。 1 数组溢出 数组溢出是最常见的一种溢出。因为在C语言中,含N个元素的数组下标是从0开始,到N-1结束,而且C语言没有提供数组越界检查的机制。 请看如下代码: int main (int argc, char* argv[]) {     int nSum = 0;     int nArray[] = {

王云腾的专栏 1万+

谈谈我对C语言的初认识

其次,C语言被称为一门语言-人和计算机的语言,顾名思义C语言应该也仅仅是成为编程的人的第一步也是很重要的一步,但它又与人类之间的语言不同它更简洁也跟严苛如果说优美的诗篇是一个诗人的成就呢一个简介明了功能齐全的程序就是一个编程人员的心血结晶。从我这么多天的学习下来它也不是呢么的容易我原来总是范一个错误---就是盲目的且没有规划的去写一个程序导致错误百出且修改起来很麻烦所以要想学好这么语言绝不是简单的推进程序的运行而是去让程序在自己所设置的框架中优美的运行。

Catking23的博客 1342

谈谈B端、C端、G端的产品区别

本文以实践经历为出发并结合行业观点, 从领域划分、用户特征、常见误区等方面 浅谈B端,C端,G端的不同特征及各自运营要点。 一、运营唯C论是这么炼成的? 造成这种理论形成的原因,在朱朱看来,可能有以下三点: C端发展成熟且方法论易提取:C端是基于单一个人的服务业务场景简单且发展早品类多,因此很容易总结基于个人的普遍性的需求痛点及解决问题的通用性方法论。 非C端业务专业性强方法具有...

kevin1993best的博客 3万+

谈谈C语言

讲讲c语言?c语言的定义基本简介来源特点补 充特有特点 c语言的定义 C语言是一门面向过程、抽象化的通用程序设计语言, 广泛应用于底层开发。 C语言能以简易的方式编译、处理低级存储器。 C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级...

qq_40570657的博客 379

谈谈个人学c经历

谈谈大一期间的经历,和一些建议

学习C++的小陈同学 1411

C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符 字符串是多个字符的集合,他们由" "包围,如"http://www.baidu.com"。字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存。 当然,字符串也可以只包含一个字符,例如"A",不过一般我们使用专门的字符类型来处理这种只包含一个字符的情况。 常用到的字符类型是char,他的长度为1,只能容纳ASCII码表中的字符,也就是英文字符。 如果想处理汉语、日语、汉语等,就需要使用其他的字符类型,c

jayer的博客 8262

java 浅堆 深堆_JVM中的一个小知识点:深堆和浅堆的概念

java中的堆内存算是整个内存区域中最重要的一块,几乎所有的对象都分配在堆内存。在堆内存中有两个主要的概念需要我们理解,这对分析java堆内存的故障有着重要的作用,分别是深堆和浅堆。一、概念我们先给出概念,然后再分析。(1)浅堆表示一个java对象结构所占用内存的大小,这个java对象内部包含了三部分数据:对象头、实例数据和对齐填充。(2)深堆表示一个java对象被 GC 回收后,可以真实释放的内...

weixin_35719775的博客 479

谈谈什么是 C 和 C ++ 标准库?

C和C++标准库是两种编程语言的核心功能集合。C标准库提供基础功能,包括输入/输出(stdio.h)、内存管理(stdlib.h)、字符串处理(string.h)、数学运算(math.h)和时间处理(time.h)等模块,支持文件操作、动态内存分配、字符串操作和数学计算等常见任务。C++标准库则更为丰富,核心是标准模板库(STL),包含容器(如vector、map)、算法(如sort、find)和迭代器等组件,还提供输入/输出流库(iostream、fstream)和字符串流(sstream)等功能。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 777

从生命周期的角度谈谈 Oracle 12c, 18c, 19c 和 20c

转载: 原文链接:从生命周期的角度谈谈 Oracle 12c, 18c, 19c 和 20c 看到的博客链接:从生命周期的角度谈谈 Oracle 12c, 18c, 19c 和 20c 之前的博客我们了解到Oracle 20c即将发布,如下: Oracle 20c 官方文档正式发布 https://www.cndba.cn/dave/article/4029 在我去年出版的《Oracle 18c 必须掌握的新特性》一书中也有一小节专门讲解了Oracle 的生命周期以及补丁的变化。 《Oracle 18

m0_60311330的博客 4566

从C语言观点谈谈内存寻址

<br />最近看了一些书籍,由此想把以前所学的关于对内存的思考的一些知识点整理下。<br />计算机的寻地址分为指令寻地址和操作数寻址,由于这些和组成原理还有汇编语言联系的很紧,但我这里要说的是仅仅从C语言的角度去谈谈寻址问题。<br />首先的操作数寻址的问题,关于这个其实C语言提供了很好很强大的一个玩意,它的名字叫做指针,正是由于它,我们才说C语言是比较接近底层的语言,因为通过它我们可以剖析计算机内存的奥秘。比如说一个超级easy的程序:<br />int main()<br />{<br />int

灰熊大侠的专栏 1390
下一篇: 队列排排栈?!
LeiMPro
博客等级 码龄10年 12粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值