刷题日记——干碎那个BFS!(含国科大机试2021)

news2024/10/6 10:40:21

例题小引——迷宫问题

问题描述:

迷宫由n行m列的单元格组成(n,m都小于等于50),每个单元格要么是空地,要么是障碍物。
现请你找到一条从起点到终点的最短路径长度。
在这里插入图片描述

分析——(迷宫问题BFS解法)

  1. 使用BFS算法,进行广度优先遍历,总体思路是访问一个结点,就把相邻的结点入队,然后下一个访问的结点就是队首结点,依此循环到终点
  2. 相邻结点的判断:由于上述迷宫只能上下左右四个方向,因此设计坐标轴,上下左右按照坐标增减来确定坐标

代码

#include <bits/stdc++.h>

using namespace std;

int field[100][100];
bool visited[100][100]={false};

struct point{
  int x;
  int y;
  int step;
};

queue<point> info;//结点信息队列

int direct_x[4] = {-1,1,0,0};//方向:上下左右
int direct_y[4] = {0,0,-1,1};

int main()
{
    //输入
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
      for(int j=1;j<=m;j++){
        scanf("%d",&field[i][j]);
      }
    }
    int start_x,start_y,end_x,end_y;
    scanf("%d%d%d%d",&start_x,&start_y,&end_x,&end_y);

    //BFS
    point start;
    start.step = 0;
    start.x = start_x;
    start.y = start_y;

    info.push(start);

    visited[start_x][start_y] = true;

    bool flag = false;

    while(info.empty()!=true){
      int x = info.front().x;
      int y = info.front().y;
      if(x==end_x&&y==end_y){
        printf("%d\n",info.front().step);
        flag = true;
        break;
      }
      for(int i=0;i<4;i++){
        int temp_x = x+direct_x[i];
        int temp_y = y+direct_y[i];
        if(field[temp_x][temp_y]==1&&visited[temp_x][temp_y]==false){
          point temp;
          temp.x = temp_x;
          temp.y = temp_y;
          temp.step = info.front().step +1;
          info.push(temp);
          visited[temp_x][temp_y]==true;
        }
      }
      info.pop();//队首出队
    }
    if(flag==false){
      printf("no way");
    }
    return 0;
}

迷宫问题使用BFS的总结

需要定义的重要数组

  • 迷宫地图:二维数组 f i e l d [ m ] [ n ] field[m][n] field[m][n],其中 m m m是行数, n n n是列数
  • 已访问标记:二维bool数组 v i s i t e d [ m ] [ n ] visited[m][n] visited[m][n]
  • 地址信息:结构体,需要包含该地址的横纵坐标和到达此处走的步数
  • 指路队列:以地址信息为数据类型的队列,每次离开一个地址之前,先要把接下来能够去的地址信息入队
  • 方向数组:两个数组 d i r e c t x [ w a y s ] direct_x[ways] directx[ways] d i r e c t y [ w a y s ] direct_y[ways] directy[ways],ways表示在一个地址处能够移动的方向个数,数组存的是如果按照这个方向走,其横纵坐标变化情况

初始化

  • 输入迷宫信息初始化迷宫地图
  • 根据出发点信息,创建地址信息结点加入队列,初始时的步数是0
  • 初始时地图上所有结点都未访问,访问标记设为false

BFS启动

  1. 当指路队列非空时,重复操作1~4,如果空,跳到5.
  2. 根据指路队列首结点,即当前的位置(横纵坐标),判断是否到达终点,如果到达跳到5.,没有到达执行3
  3. 遍历查看所有的ways个方向指向的地址能不能到达,如果可以到达,那么将该地址入队
  4. 所有能走的路都计入队列后,离开当前地址,跳到1.
  5. 判断:如果是从1跳过来的,说明终点不可达;如果是从2跳过来的,说明终点可达,且当前队首所指地址信息的步数就是从起点到终点的总步数

小试牛刀——石油储藏(中国科学院大学2021年机试题)

在这里插入图片描述

分析

  • 按照行列顺序遍历地图,一旦找到‘@’,那么就以此地址作为起点,进行BFS:
  • BFS:对于沿途所有能到达的地址,如果该地址是‘@’,那么就置为’*',同时设置为已访问
  • 每完成一次BFS就表明一个连续的油田已经被勘测完毕,油田计数器+1
  • 遍历完地图,油田计数器值即为地图上油田数

代码

#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
using namespace std;
char field[101][101];
bool visited[101][101]={false};

struct address{
  int x;
  int y;
};

int direct_x[8] = {-1,-1,-1,0,1,1, 1, 0};
int direct_y[8] = {-1, 0, 1,1,1,0,-1,-1};

queue<address> instructor;


void BFS(int x, int y){
  address start;
  start.x = x;
  start.y = y;
  field[x][y] = '*';
  visited[x][y] = true;
  instructor.push(start);
  while(instructor.empty()!=true){
    int x = instructor.front().x;
    int y = instructor.front().y;
    for(int i=0;i<8;i++){
      int temp_x = x+direct_x[i];
      int temp_y = y+direct_y[i];
      if(field[temp_x][temp_y]=='@'&&visited[temp_x][temp_y]==false){
        address temp;
        temp.x = temp_x;
        temp.y = temp_y;
        field[temp_x][temp_y]='*';
        visited[temp_x][temp_y]=true;
        instructor.push(temp);
      }
    }
    instructor.pop();
  }
}

int main(){
  int m,n;
  while(true){
    scanf("%d%d  ",&m,&n);
    if(m==0&&n==0){
      break;
    }
    for(int i=1;i<=m;i++){
      for(int j=1;j<=n;j++){
        scanf("%c",&field[i][j]);
        visited[i][j]=false;//多次输入,随输入进行初始化
      }
      scanf("%c",&field[i][0]);
    }
    /*for(int i=1;i<=m;i++){
      for(int j=1;j<=n;j++){
        printf("%d\t%d\t%c\n",i,j,field[i][j]);
      }
      printf("\n");
    }*/

    int counts = 0;
    for(int i=1;i<=m;i++){
      for(int j=1;j<=n;j++){
        if(field[i][j]=='@'){
          BFS(i,j);
          counts++;
        }
      }
    }
    printf("%d\n",counts);

  }

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridRow)

栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本…

实战!wsl 与主机网络通信,在 wsl 中搭建服务器。学了计算机网络,但只能刷刷面试题?那也太无聊了!这篇文章可以让你检测你的计网知识!

前言&#xff08;碎碎念&#xff09;&#xff1a;每次发布文章时&#xff0c;我都是一个纠结的过程。因为我给自己写笔记时&#xff0c;只需要记录自己不清晰或者易忘的知识点就可以了&#xff0c;但一旦想要作为文章发布&#xff0c;那么我就得考虑到很多人是纯新手&#xff0…

1TGE120011R1111变频器全国发货质保一年

1TGE120011R1111 ABB ABB的1TGE120011R1111是一个属于其TGE系列的小型断路器&#xff08;也称为微型断路器或MCB&#xff09;。这个系列的断路器主要用于低压配电系统&#xff0c;为电路提供过载和短路保护。以下是这款断路器的一些特点&#xff1a; 紧凑设计&#xff1a;TGE系…

【数据库】数据库基本知识

1.数据库的四个基本概念 1.1 数据&#xff1a;描述事务的符号记录 1.2 数据库&#xff1a;概括的说&#xff0c;数据库数据具有永久存储、有组织的、可共享的大量数据的集合&#xff0c;数据库中的数据按一定的数据模型组织、描述和储存&#xff0c;具有较小的冗余度、较高的…

2、鸿蒙学习-申请调试证书和调试Profile文件

申请发布证书 发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书&#xff0c;可保障软件代码完整性和发布者身份真实性。证书格式为.cer&#xff0c;包含公钥、证书指纹等信息。 说明 请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。 1、登录AppGa…

AI美图设计室试用,可以生成PPT,以及模特试衣

文章目录 美图设计室试用 美图设计室试用 美图设计室是美图秀秀的公司推出的AI图像处理工具&#xff0c;其功能涵盖图片编辑、抠图、海报设计、文生图等常用的AI功能。尽管很多功能需要开通会员使用&#xff0c;但一些免费功能的表现也还不错&#xff0c;值得一用。 美图设计…

【解读】NIST网络安全框架CSF 2.0

2014年&#xff0c;NIST&#xff08;美国国家标准与技术研究所&#xff0c;类似于中国的工信部&#xff09;首次发布了网络安全框架CSF&#xff08;Cybersecurity Framework)&#xff0c;十年后&#xff0c;在2024年2月26日发布了重大更新&#xff08;CSF 2.0&#xff09;&…

【蓝屏分析】WHEA_UNCORRECTABLE_ERROR 问题分析与解决

背景信息 电脑名字电脑类型厂商使用时间magicbook14 2020款 R5 4500U笔记本电脑荣耀HONOR3年9个月 内存CPUGPU硬盘焊死在主板上焊死在主板上集显PCIe 4.0 NVMe M.2 固态 软硬件错误源确定 电脑莫名频繁随机蓝屏&#xff0c;由于在软件环境上无迹可寻推测是硬件问题 蓝屏画面…

Pretrain-finetune、Prompting、Instruct-tuning训练方法的区别

来自&#xff1a;【多模态】28、LLaVA 第一版 | Visual Instruction Tuning 多模态模型的指令微调_多模态指令跟随数据-CSDN博客 几种模型训练方法的区别&#xff1a; 1、Pretrain-finetune&#xff1a;先在大量数据集上做预训练&#xff0c;然后针对某个子任务做 finetune 2…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

实现悲观协议,除了锁还能咋办?

相对乐观和局部悲观是一体两面的关系&#xff0c;识别它的要点就在于是否有全局有效性验证&#xff0c;这也和分布式数据库的架构特点息息相关。但是关于悲观协议&#xff0c;还有很多内容没有提及&#xff0c;下面我们就来填补这一大块空白。 悲观协议的分类 要先跳出来&…

Word使用通配符替换

1.通配符替换 使用&#xff08;[通配替换文本]&#xff09; M-MM12-00([0123456789])-0([0123456789])([0123456789])-0([0123456789])([0123456789]) 2.根据自定义格式替换 根据格式、样式替换&#xff0c;如只替换标题的内容&#xff0c;不替换征文

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…

STM32的USART能否支持9位数据格式话题

1、问题描述 STM32L051 这款单片机。平常的 USART 串口传输是 8 位数据&#xff0c;但是他的项目需要用串口传输 9 位数据。当设置为 8 位数据时&#xff0c;串口响应中断正常。但是&#xff0c;当设置为 9 位数据时&#xff0c;串口就不产生中断了。USART2 的 ISR 寄存器 RXN…

前端基础篇-深入了解 JavaScript(一)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述…

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…

Qt文件读写

做一个简单的文件读写&#xff0c;我们把一个结构体内的数据写入到二进制文件中&#xff0c;并重新读取解析。代码结构如下&#xff1a; 项目名称随便起就好了。main.cpp是主函数&#xff1b;DataHandler实现文件的写与读&#xff0c;还要模拟过程&#xff1b;Definition.h放置…

蚁群算法实现 - 全局路径规划算法

参考博客&#xff1a; &#xff08;1&#xff09;【人工智能】蚁群算法(密恐勿入) &#xff08;2&#xff09;计算智能——蚁群算法 &#xff08;3&#xff09;蚁群算法(实例帮助理解) &#xff08;4&#xff09;【数之道 04】解决最优路径问题的妙招-蚁群ACO算法 &#xff08;…

51单片机—DS18B20温度传感器

目录 一.元件介绍及原理 二&#xff0c;应用&#xff1a;DS18B20读取温度 一.元件介绍及原理 1.元件 2.内部介绍 本次元件使用的是单总线 以下为单总线的介绍 时序结构 操作流程 本次需要使用的是SKIP ROM 跳过&#xff0c; CONVERT T温度变化&#xff0c;READ SCRATCHPAD…

IP对讲终端SV-6002 可以选配POE供电方式

18123651365微信 IP对讲终端SV-6002是一款采用了ARMDSP架构&#xff0c;接收网络音频流&#xff0c;实时解码播放&#xff1b;配置了麦克风输入和扬声器输出&#xff0c;作为网络数字广播的播放终端。主要用于银行、部门机构、酒店等场所的网络广播、网络对讲。 I…