POJ 1979 基础搜索 DFS\BFS 一

本文通过POJ1979题目的实例,详细对比了广度优先搜索(BFS)与深度优先搜索(DFS)两种算法的具体实现过程。从代码实现到运行逻辑,深入浅出地介绍了这两种常用图遍历算法的应用场景及特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  遥想各位大佬都在努力刷题学习,明明可以靠天赋,依然这么努力的拼搏。

  实在忍不住做起Vjudge,进一步发现自己的愚蠢.....快哭了

 

  首先来了一道手速题,POJ 1979    : http://poj.org/problem?id=1979

  题意: 一个矩阵,问起点出发,有几个可达位置数。 

  作为菜鸟,我先写了不熟练的BFS,然后再写了DFS。 交了就过了。 然而这么简单的题目我就写了2小时。做题实在太少,各种细节错误,字符打错什么的。  O__O "…抠脚

  写BFS的思路是:

   队列开始装入首点。  

  取点;判断是否踩过,踩过就过,否则计数标记并接下去;                                   (取出再踩,踩未踩的,踩了再拓展)不够清晰

  将周围的不越界的点都放入队列     ——(重复至空)

 

  写DFS的思路是:

                               判断此点有无越界,判断此点是否踩过                            (递归终止条件)

                               未踩过标记并就对此点各方向递归                                   (递归实现内容)

 

  很久没写了,写搜索非常艰难以及思维混乱

  BFS代码:

 

#include"cstdio"
#include"cstring"
#include"queue"
using namespace std;
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};

int pan(int i,int j)
{
    if(i<0||i>=n||j<0||j>=m)return 0;
    if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
    return 0;
}

struct node{
    int x,y;
    node(int i,int j)
    {
        x=i;
        y=j;
    }
};

void BFS(int beginx,int beginy)
{
    queue<node>q;
    q.push(node(beginx,beginy));
    while(!q.empty())
    {
        node t=q.front();
        q.pop();
        int x=t.x;
        int y=t.y;
        if(book[x][y])continue;
        book[x][y]=1;
        ans++;

        int i;
        loop(i,0,4)
        {
            int& _x=change[i][0];
            int& _y=change[i][1];
            if(!pan(x+_x,y+_y))continue;
            q.push(node(x+_x,y+_y));
        }
    }
}

int main()
{
    int i,j;
    int beginx,beginy;

    while(~scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)break;
        loop(i,0,n)
            scanf("%s",pos[i]);

        loop(i,0,n)
            loop(j,0,m)
            if(pos[i][j]=='@')
            {
                beginx=i;
                beginy=j;
                break;
            }
        memset(book,0,sizeof book);
        ans=0;
        BFS(beginx,beginy);
        printf("%d\n",ans);
    }
    return 0;

}

 

 

  DFS代码:

 

#include"cstdio"
#include"cstring"
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};

int pan(int i,int j)
{
    if(i<0||i>=n||j<0||j>=m)return 0;
    if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
    return 0;
}

void dfs(int i,int j)
{
    if(!pan(i,j))return;
    if(book[i][j])return;
    book[i][j]=1;
    ans++;
    int k;
    loop(k,0,4)
    {
        int &x=change[k][0];
        int &y=change[k][1];
        dfs(i+x,j+y);
    }
}

int main()
{
    int i,j;
    int beginx,beginy;

    while(~scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)break;
        loop(i,0,n)
            scanf("%s",pos[i]);

        loop(i,0,n)
            loop(j,0,m)
            if(pos[i][j]=='@')
            {
                beginx=i;
                beginy=j;
                break;
            }
        memset(book,0,sizeof book);
        ans=0;
        dfs(beginx,beginy);
        printf("%d\n",ans);
    }
    return 0;

}

 

 


 

 

 

、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值