BFS(广度优先搜索)简单例题(一)

2023-10-29

bfs想必非常的熟悉了,bfs大多数用来解决什么问题呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。所以这篇博客,主要是利用bfs找迷宫的最短距离。首先看看bfs一般的使用套路:

Problem 2285 迷宫寻宝

链接:http://acm.fzu.edu.cn/problem.php?pid=2285

本题就是一个基本上就是纯模板题,就是从S开始走,走到终点E的路径最短,#是障碍物不能走,如果不能找到终点的路就输出-1,而且只能上下左右四个方向走。

思路就是先遍历一遍记录初始位置,和终点的位置,然后就是纯正的模板了,利用bfs来实现,但是在实现的过程中,如果找到终点那么就标记一下,然后break掉。没有标记的话就直接输入-1。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
char a[1010][1010];//记录整个图形的
int vis[1010][1010];//用来标记的走没走过
struct Point{
     int x, y;
}tmp1, tmp2;
int mt[4][2] = {1,0,-1,0,0,1,0,-1};//移动的四个方向
queue<Point>q;
int main(){
    int n, i, j;
    while(~scanf("%d", &n)){
         for(i = 0; i < n; i++){
            scanf("%s", a[i]);
         }
         int sx, sy;
         int ex, ey;
         for(i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                vis[i][j] = 0;//初始化标记
                if(a[i][j] == 'S'){//找到初始位置
                    sx = i;
                    sy = j;
                }
                else if(a[i][j] == 'E'){//终点位置
                    ex = i;
                    ey = j;
                }
            }
         }
         while(!q.empty()){//队列初始化
             q.pop();
         }
         tmp1.x = sx;
         tmp1.y = sy;
         vis[tmp1.x][tmp1.y] = 1;//首先压入起始位置
         q.push(tmp1);
         int flag = 0;
         while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 4; i++){
                tmp2.x = tmp1.x + mt[i][0];//引动的方向
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >=0 && tmp2.x < n && tmp2.y >= 0 && tmp2.y < n && !vis[tmp2.x][tmp2.y] && a[tmp2.x][tmp2.y] != '#'){
                        //判断条件
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;//原来的位置加一
                    q.push(tmp2);
                }
            }
            if(vis[ex][ey]){//如果到达终点就标记一下,表示能到达终点
                flag = 1;
                break;
            }

         }
         if(flag)printf("%d\n", vis[ex][ey]-1);//终点位置也包括在内,所以减1
         else printf("-1\n");

    }

return 0;
}

移动

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1181

本题就是在300*300的方格内移动问起始点到终止点的最小移动距离,输入数据只给了起始点坐标,和终止点坐标。本题也是一个非常明显的一个bfs题型。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

int vis[305][305];
int mt[8][2] = {1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2};
struct Point{
    int x, y;
}tmp1, tmp2;
queue<Point>q;
int main(){
    int sx, sy, ex, ey;
    while(~scanf("%d %d %d %d", &sx, &sy, &ex, &ey)){
        while(!q.empty()){
            q.pop();
        }
        memset(vis, 0, sizeof(vis));//注意格式化,切记。非常容易忘
        tmp1.x = sx;
        tmp1.y = sy;
        vis[tmp1.x][tmp1.y] = 1;
        q.push(tmp1);
        int i;
        while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 8; i++){
                tmp2.x = tmp1.x + mt[i][0];
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >= 0 && tmp2.x <=300 && tmp2.y >= 0 && tmp2.y <= 300 && !vis[tmp2.x][tmp2.y] ){
                        //判断条件范围限制在300*300的范围
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;
                    q.push(tmp2);
                }

            }
            if(vis[ex][ey])break;
        }
        printf("%d\n", vis[ex][ey]-1);
    }
return 0;
}

迷宫问题

链接:http://poj.org/problem?id=3984

本题也是一个走迷宫的问题,但是本题和之前的几道题之间的差距就在于本题问你是如何走得,也就时你走迷宫的具体路径,主体思想跟之前的几道题没有变依然是bfs类的问题,但是重点是如何储存走过的点,以及如何输出。

记录输入输出的思想就是要从终点开始往回找点,用另外的结构体数组储存一下,然后输出就可以了,但是如何往回找呢?往回找就看你是如何储存的,先申请结构体数组。用要压入点的位置pre[tmp2.x][tmp2.y].x来记录前一个数组横坐标的位置,pre[tmp2.x][tmp2.y].y来记录另外一个数字纵坐标的位置。

pre[tmp2.x][tmp2.y].x = tmp1.x;

pre[tmp2.x][tmp2.y].y = tmp1.y; 

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int maze[6][6];
int vis[6][6];

struct Point{
     int x, y;
}tmp1, tmp2;
Point pre[10][10];
int mt[4][2] = {1,0,-1,0,0,1,0,-1};
queue<Point>q;
Point ans[30];
int main(){
    int i, j;
    while(~scanf("%d %d %d %d %d", &maze[0][0], &maze[0][1], &maze[0][2], &maze[0][3],&maze[0][4],&maze[0][5])){
        for(i = 1; i < 5; i++){
            for(j = 0; j < 5; j++){
                scanf("%d", &maze[i][j]);
            }
        }
        while(!q.empty()){
            q.pop();
        }
        memset(vis, 0, sizeof(vis));
        tmp1.x = 0;
        tmp1.y = 0;
        vis[0][0] = 1;
        q.push(tmp1);
        while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 4; i++){
                tmp2.x = tmp1.x + mt[i][0];
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >= 0 && tmp2.x < 5 && tmp2.y >= 0 && tmp2.y < 5 && !vis[tmp2.x][tmp2.y] && maze[tmp2.x][tmp2.y] == 0){
                    //约束条件
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;
                    q.push(tmp2);
                    pre[tmp2.x][tmp2.y].x = tmp1.x;//保存前一个位置的横坐标
                    pre[tmp2.x][tmp2.y].y = tmp1.y;//保存前一个位置的纵坐标

                }
            }
            if(vis[4][4])break;
        }
        //cout<<vis[4][4]<<endl;
        int lastx = 4, lasty = 4;//终点的位置
        int x, y, num = 0;
        while(lastx || lasty){//如果lastx, lassty,如果全为零的话就停止
            ans[num].x = lastx;//ans 来记录一下
            ans[num++].y = lasty;

            x = lastx;
            y = lasty;
            lastx = pre[x][y].x;//读取下一个,也就是之前保存的前一个
            lasty = pre[x][y].y;

        }
        //cout<<num<<endl;
        printf("(0, 0)\n");
        for(i = num-1; i >= 0; i--){//逆序输出
            printf("(%d, %d)\n", ans[i].x, ans[i].y);
        }





    }
return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BFS(广度优先搜索)简单例题(一) 的相关文章

  • spring MVC笔记

    应该还是要学spring mvc 同时学习session网络编程 先简单写一点 后续再完善 Servlet生命周期的三个阶段 init service destroy 在我们第一次学Servlet编程 学java web的时候 还没有那么多
  • 域名解析错误分析及解决

    1 1 1 初步判断 查看网络是否连接 执行命令 ifconfig 执行命令 看是否能被解析 ping localhost ping www baidu com 不能被解析时 会提示错误 ping bad address xxx 1 1 2
  • Dense-Unet实现眼底图像血管分割(VesselNet)

    之前用Retina Unet项目实现了眼底图像血管分割 分割网络用的是Unet 现在看了DenseNet之后 将之前Unet网络中的Conv2d替换成下图的Dense Block之后 效果会有提升 在DRIVE数据集上的AUC值 Metho
  • 配置Nginx作为动态应用程序代理

    简介 在本教学文章中 我们将学习如何将Nginx配置为代理动态应用程序 如PHP Python或Node js 以处理动态请求 通过将Nginx配置为动态应用程序代理 我们可以提供高性能 可靠和安全的动态内容传递 本教程将介绍如何配置Ngi

随机推荐

  • C++初识

    简单的C 程序 include
  • linux 内核编程 常见错误,Linux编程常见错误及解决方案

    对于linux新手来说Linux编程会经常遇见一些问题 今天列出新手们最经常遇到的编程错误 并提供解决方案 1 由于是Linux新手 所以现在才开始接触线程编程 照着GUN Linux编程指南中的一个例子输入编译 结果出现如下错误 unde
  • [Pytorch系列-52]:循环神经网络RNN - 全连接网络与RNN网络在时间序列数据集上拟合的比较

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121526014 目录 第1章 概述
  • IDEA实现远程调试步骤详解

    IDEA不仅可以本地调试代码 也可以远程调试代码 一 基本原理 本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信 传递调试指令和调试信息 被调试程序的远程虚拟机 作为 Debug 服务端 监听 Debug 调试
  • 【Mo 人工智能技术博客】时序预测模型——LSTNet

    时序预测模型 LSTNet 作者 陈东瑞 1 背景 多元时间序列数据在我们的日常生活中无处不在 从股票市场的价格 高速公路上的交通流量 太阳能发电厂的输出量 不同城市的温度等等 在这样的应用中 用户通常对基于时间序列的历史观察来对新趋势或潜
  • 人脸识别技术的成熟让刷脸支付落地

    按照识别的精度排序 确实是虹膜 指纹 人脸的识别精度依次降低 但人脸识别可以根据摄像头的提升而提升 双目摄像头 结构光摄像头 TOF等等 这个上升空间很大 从应用性来看 你现在让所有的用户都去提取虹膜信息 指纹信息 这个很难 不现实 而我们
  • 文件复制到u盘后文件夹是空的,怎么恢复?

    便携式存储设备有很多种 其中就有u盘 由于这个给予我们生活工作中极大的便利 相信不少小伙伴都喜欢随身携带一个 但不少人遇到过明明已经把文件存放到u盘里了 在正常打开的情况下 再次使用时 出现u盘文件夹是空白的 碰到这样的情况 文件复制到u盘
  • 量化指标公式源码_精选指标:通达信公式无敌紫金钻选股指标——附源码

    精选指标 通达信公式无敌紫金钻选股指标 附源码 精选指标 通达信公式无敌紫金钻选股指标 附源码 VAR1 CLOSE MA CLOSE 21 MA CLOSE 21 100 VAR2 CLOSE LLV LOW 43 HHV HIGH 43
  • 第10章 K8s进阶篇-高级调度计划任务,污点和容忍和Affinity

    10 1 什么是Job job常用作初始化数据和基本的创建操作 job创建成功后不会立即执行容器命令 只有suspend true 才会执行 10 2 Job使用入门 root k8s master01 10st cat job yaml
  • HTML实现简单登录以及界面跳转

  • 经典上中(左右)下三栏布局

    经典上中 左右 下三栏布局 利用绝对定位实现三栏布局 1 html div class container div class top 我是顶部 div div class content div class div div div
  • 构建用户画像-标签体系

    用户画像是目前在技术公司广泛使用的技术 是根据客户人口统计信息 社交关系 偏好习惯和消费行为等信息而抽象出来的标签化画像 常常用在精准营销 圈定人群 发送短信消息 APP弹窗等等 用户画像的准确性往往会直接影响到运营的效果和获客成本 用户画
  • Qt Widgets 之 QDockWidget(停靠窗口)

    目录 什么是停靠窗口 如何添加停靠窗口 QDockWidget setWidget QMainWindow addDockWidget 设置停靠选项 Options AnimatedDocks AllowNestedDocks AllowT
  • Keil在线调试程序乱跑

    最近改了一个别人写的程序 但是在调试器调试过程中出现了一个奇怪的现象 代码部分如下 Sys Run这个函数在main函数中被无限循环调用 初始化时我会将TCENABLE这个标志位置0 通过CAN发送信息来改变他的数值 按道理来说当我运行程序
  • gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

    相关博客http blog chinaunix net uid 24954950 id 2956476 html 相关博客http blog csdn net misiter article details 7514428 相关博客http
  • linux top命令看到的实存(RES)与虚存(VIRT)分析

    近期在公司中解决程序使用的内存高问题 将一部分之前无法回收的内存进行了回收 实现降内存效果 降实存 在统计效果时 QA问是统计RES 实存 还是VIRT 虚存 在网上学习看了一些博客 这里自己总结一下RES和VIRT的区别 1 概念 VIR
  • 绘制同y轴双侧柱状图,且y轴位置在坐标为0的位置,左右x轴均为正值(Python)

    绘制同y轴双侧柱状图 且y轴位置在坐标为0的位置 左右x轴均为正值 Python 在数据可视化中 柱状图是一种常用的图表类型 用于展示不同类别或变量之间的比较 本文将介绍如何使用Python绘制一个同y轴双侧柱状图 且y轴的位置在坐标为0的
  • JQuery之ContextMenu(右键菜单)

    插件下载地址 http www trendskitchens co nz jquery contextmenu jquery contextmenu r2 js 压缩版 http www trendskitchens co nz jquer
  • java_分数

    题目内容 设计一个表示分数的类Fraction 这个类用两个int类型的变量分别表示分子和分母 这个类的构造函数是 Fraction int a int b 构造一个a b的分数 这个类要提供以下的功能 double toDouble 将分
  • BFS(广度优先搜索)简单例题(一)

    bfs想必非常的熟悉了 bfs大多数用来解决什么问题呢 一个最直观经典的例子就是走迷宫 我们从起点开始 找出到终点的最短路程 很多最短路径算法就是基于广度优先的思想成立的 所以这篇博客 主要是利用bfs找迷宫的最短距离 首先看看bfs一般的