队列的应用——(一)广度优先搜索

2023-10-30

在队列中,同样可以用于走迷宫,而且会出现一个与之前不同的情形。

代码如下:(C++)

myqueue.h

#include<stdio.h>
#include<stdlib.h>
struct Point
{
        int _x;
        int _y;
};
struct  Node
{
        Point data;
        Node* next;
};

struct Queue
{
        Node*front;
        Node*rear;
};

void initQueue(Queue*q);
bool enQueueEmpty(Queue*q);
void enQueue(Queue*q,Point ch);
Point deQueue(Queue*q);
void resetQueue(Queue*q);
void destroyQueue(Queue*q);

 

myqueue.cpp

跟队列动态实现一样,只是把char变量换成了Point

#include"myqueue.h"
void initQueue(Queue*q)
{
    q->front = q->rear = (Node*)malloc(sizeof(Node));
    q->front->next=NULL;
}
bool enQueueEmpty(Queue*q)
{
    return q->front==q->rear;
}
void enQueue(Queue*q,Point ch)
{
    Node*cur= (Node*)malloc(sizeof(Node));
    cur->data=ch;
    cur->next=NULL;

    q->rear->next=cur;
    q->rear=cur;
}
Point deQueue(Queue*q)
{
    Point ch = q->front->next->data;
    if(q->front->next == q->rear)
    {
        q->rear = q->front;
        free(q->front->next);
        q->front->next=NULL;
    }
    else
    {
        Node*t=q->front->next;
        q->front->next=t->next;
        free(t);
    }
    return ch;
}
void resetQueue(Queue*q)
{
    Node* head=q->front->next;
    q->front->next=NULL;
    q->rear=q->front;
    Node*t;
    while(head)
    {
        t=head->next;
        free(head);
        head=t;
    }
}
void destroyQueue(Queue*q)
{
    resetQueue(q);
    free(q->front);
}

main函数

#include <iostream>
#include"myqueue.h"
#include <windows.h>
#define MAXROW 10
#define MAXLINE 10
//宏定义把迷宫 长宽都定义成10
using namespace std;
Queue s;  //变成全局,方便调用

Point prePoint[MAXROW][MAXLINE];//创建一个二维坐标

int maze[MAXROW][MAXLINE] =     //这个函数跟之前栈走迷宫是一样的
{
    1,1,1,1,1,1,1,1,1,1,
    0,0,0,1,1,1,1,1,1,1,
    1,1,0,1,1,1,1,1,1,1,
    0,0,0,0,0,0,1,1,1,1,
    1,1,0,1,1,0,1,1,1,1,
    1,1,0,1,0,0,0,1,1,1,
    1,1,0,1,1,0,1,1,1,1,
    1,1,0,1,1,0,0,0,1,1,
    1,1,0,1,0,1,1,0,0,0,
    1,1,0,0,0,1,1,1,1,1,
};

void displyMaze()
{
    for(int i=0; i< MAXROW; i++)
    {
        for(int j=0; j<MAXLINE; j++)
        {
            if(maze[i][j] == 1) printf("%2s"," *");          //代表迷宫的墙
            else if(maze[i][j] == 2) printf("%2s"," #"); //代表走过的路,用#代表
            else printf("%2s"," ");                               //代表迷宫的路
        }
        putchar(10);
    }
    printf(" ====================\n");
}

void displayPrePoint()
{
    for(int i=0; i< MAXROW; i++)
    {
        for(int j=0; j<MAXLINE; j++)
        {
            printf(" (%2d,%2d) ",prePoint[i][j]);
        }
        putchar(10);
    }
    printf(" ====================\n");
}

void visit(int x,int y,Point lastP )
{
    Point p={x,y};
    enQueue(&s,p);
    prePoint[x][y]=lastP;  //这里存储的是上一步为已经出队的点
                                       //这样就形成了每个点都存储了上一个位置的点的二维数组
}

int main()
{
    Point sp={1,0},ep={8,9};//迷宫起点和终点(结构体只能这样初始化)

    memset(prePoint,0xff,sizeof(Point)*MAXLINE*MAXROW);

    initQueue(&s);
    enQueue(&s,sp);
    int flag=1;
#if 1
    while(!enQueueEmpty(&s))
    {
        Point t;
        t=deQueue(&s);       //弹出队列里存的点(这个点就是当前位置的点)
        maze[t._x][t._y]=2;   //表示走过的路,标记为 2

        system("cls");           //这是自动寻路刷新界面,然后有寻路动画
        displyMaze();
        Sleep(100);

        //竖是x轴. 横是y轴(数组的原理)
        //判断各方向的点能不能走,1.坐标从0开始 2.不能是死路 3.不能是走过的路
            //上
            if(t._x-1>=0&&maze[t._x-1][t._y] == 0)
                visit(t._x-1,t._y,t);     //这个 t 指的是移动前,自己原来出队的这个点
            //下
            if(t._x+1<=9&&maze[t._x+1][t._y] == 0)
                visit(t._x+1,t._y,t);
            //左
            if(t._y-1>=0&&maze[t._x][t._y-1] == 0)
                visit(t._x,t._y-1,t);
            //右
            if(t._y+1<=9&&maze[t._x][t._y+1] == 0)
                visit(t._x,t._y+1,t);

            if(t._x==ep._x&&t._y==ep._y)
            {
                flag=0;    //给定找到出口的标志位
                destroyQueue(&s);
                break;
            }
    }
#endif
    if(flag==0)
    {
          cout<<"find path"<<endl;
    }
    else
        cout<<"find no path"<<endl;
    displayPrePoint();

    Point t=ep;
    while(t._y!=-1)
    {
        printf(" (%d,%d) ",t._x,t._y);
        t=prePoint[t._x][t._y];
    }
    return 0;
}

现象是有岔路口时,分成几路同时走
在一条路走的时候,栈和队列本质也没有区别,都是入队一个,出队一个
有岔路的时候,就会发生几条路分别入队和出队,同步,一条路上一个入,一个出

广度优先搜索就是每条路都能同时走
 

 

 

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

队列的应用——(一)广度优先搜索 的相关文章

  • iTween基础之Rotate(旋转角度)

    一 基础介绍 二 基础属性 原文地址 http blog csdn net dingkun520wy article details 50696489 一 基础介绍 RotateTo 旋转游戏
  • Java判断字符串是否为数字(正负、小数)

    需求 传来一个String类型的参数 需要判断该参数是否为数字 正负 正数 小数都要能判断 吗 如果是小数则保留2位小数 开始采用Character isDigit 方法来判断一个字符串是否为数字 只能判断全是数字的字符串 不能判断小数 负

随机推荐

  • Anaconda创建虚拟环境+Pycharm使用Anaconda创建的虚拟环境

    首先需要下载anaconda然后在搜索栏中搜索Anaconda Prompt anaconda 点击进入 进入到envs目录然后输入以下命令 conda create n to pack python 3 7 创建一个名为 to pack且
  • vue动态绑定class属性

    vue动态绑定class的方式 第一种 对象的方式 class iscolor boo 第一个参数iscolor为类名 第二个参数boo是一个变量 类型为一个boolean值 div scope row state div data ret
  • 三角形边长求高的c语言函数公式,三角形边长计算公式

    大写数字网今天精心准备的是 三角形边长计算公式 下面是详解 求三角形的边长公式 三角形的边长公式 1 在任何一个三角形中 任意一边的平方等于另外两边的平方和减去这两边的2倍乘以它们夹角的余弦 几何语言 在 ABC中 a b c 2bc co
  • js数组分类,一维数组转二维数组

    原始数组 var arrayFirst code 1 datas a网吧 code 1 datas b网吧 code 2 datas a酒店 code 2 datas b酒店 code 3 datas a学校 code 3 datas b学
  • Flume系统搭建和使用的一些经验总结-搭建篇

    对于很多公司来说 日志的收集和集中管理是一个必然要经历的阶段 我们公司在经历了一拖再拖之后 终于不得不开始搭建日志收集系统了 对于日志收集系统 我们的首选就是Flume 为何这么坚决呢 难道没有其他工具能做个这个事情么 当然有 不过 考虑到
  • 神经网络 01(介绍)

    一 神经网络 人工神经网络 Artificial Neural Network 简写为ANN 也简称为神经网络 NN 是一种模仿生物神经网络结构和功能的 计算模型 人脑可以看做是一个生物神经网络 由众多的神经元连接而成 各个神经元传递复杂的
  • 【夜莺监控方案】01-n9e-v5-server部署

    文章目录 前言 1 在线一键安装 不推荐 2 自主安装 推荐 官方安装脚本 2 1 mysql 2 2 prometheus 2 3 n9e server 2 4 启动和开机自启 2 5 web查看 3 配置LDAP 前言 相关文档如下 0
  • Python自制音乐下载器,实现听歌自由

    前言 今天发的就是最实用的文章 让你用Python实现听歌自由 不用再担心自己的钱包了 文章末尾名片可直接领取代码 代码实现 导入模块 import os import re from urllib import parse import
  • [人工智能-深度学习-75]:环境 - Windows配置Github、Gitee共存的Git环境

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122261638 目录 前言 前置条件
  • 获取response里的数据

    String out null try ServletOutputStream os servletResponse getOutputStream Field ob ReflectionUtils findField os getClas
  • VS2015/QT creator + Qt5.8.0

    PS 两个版本IDE都试过 VS的报错更详细 方便找bug QT creator的界面更可爱 输入时有绿色的Q弹的图标嘻嘻 QT版本 qt opensource windows x86 msvc2015 64 5 8 0 win10 vs2
  • 微信小程序实例系列

    实战 微信小程序 redux 在原生微信小程序的使用实例 微信小程序 weapp redux的使用文档 微信小程序 Promise then success fail 执行顺序的问题 微信小程序 监听页面停止滚动 微信小程序 CustomB
  • PIM协议原理与配置

    PIM协议原理 PIM Protocol Independent Multicast 协议无关组播 目前常用版本是PIMv2 PIM报文直接封装在IP报文中 协议号为103 PIMv2组播地址为224 0 0 13 在PIM组播域中 以组播
  • LOAM_velodyne学习(三)

    终于到第三个模块了 我们先来回顾下之前的工作 点云数据进来后 经过前两个节点的处理可以完成一个完整但粗糙的里程计 可以概略地估计出Lidar的相对运动 如果不受任何测量噪声的影响 这个运动估计的结果足够精确 没有任何漂移 那我们可以直接利用
  • jenkins报“”Build step 'Execute Windows batch command' marked build as failure“”

    报错信息如下 解决方法
  • JVM垃圾回收器

    1 垃圾回收器的位置 2 垃圾回收器的基本概念 什么是垃圾回收器 JVM 为 Java 提供了垃圾回收机制 是一种偏自动的内存管理机制 简单来说 垃圾回收器会自动追踪所有正在使用的对象 并将其余未被使用的对象标记为垃圾 JVM会自动进行垃圾
  • 前端知识

    http www yyyweb com 5136 html 当经历所有大厂的实习后 小鱼 发布于 2018 08 15 分类 程序人生 阅读 43 评论 0 七月虽然不是一个丰收的季节 但却是一个十分酷热的月份 不知有多少小伙伴跟我一样 顶
  • MySQL server和workbench安装使用

    1 安装Notepad 运行下载的 npp 7 9 Installer x64 exe 2 安装MySQL 将mysql 8 0 22 winx64 zip解压缩 我将其放置D盘根目录下 进入文件夹 在目录中新建文件夹data和文件my i
  • docker登录私有镜像仓库时报错: x509: certificate signed by unknown authority

    文章目录 描述 报错 解决步骤 描述 由于机器在内网无法使用yum或rpm安装docker 所以使用的是离线安装 安装完成后 发现无法登录镜像地址 报错 Error response from daemon Get https swr cn
  • 队列的应用——(一)广度优先搜索

    在队列中 同样可以用于走迷宫 而且会出现一个与之前不同的情形 代码如下 C myqueue h include