深刻体验DFS与BFS之----HJ43 迷宫问题

迷宫问题(回溯、栈) 描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 本题含有多组数据。 数据范围: 2<= n,m <=10, 输入的内容 阅读详情

#HJ43 迷宫问题

描述
定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一格是可以走的路。


本题含有多组数据。
输入描述:
输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:
左上角到右下角的最短路径,格式如样例所示。
示例1
输入:
5 5
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出:
(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)
示例2
输入:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 1
0 1 1 1 0
0 0 0 0 0
输出:

(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(4,1)
(4,2)
(4,3)
(4,4)

说明:
注意:不能斜着走!!

// 这是一道典型的dfs 和 bfs的题目,这里我们用两种方法都写一下

#include <iostream>
#include<queue>
#include <vector>


using namespace std;
int row[4]={1,-1,0,0};
int col[4]={0,0,1,-1};

class Slove {
    public:
        Slove(){}
        ~Slove(){}
    void dfs(vector<vector<int>>& data,vector<vector<bool>>& used,vector<pair<int,int>>& path) {
         if(!path.empty()) {
             auto val = path.back();
             if(val.first==data.size()-1 && val.second==data[0].size()-1) {
                 if(maxlength>path.size()) {
                     res=path;
                     maxlength=path.size();
                     return;
                 }
             }
         }
        
        // 开始寻找
        auto val=path.back();
        for(int i=0;i<4;i++) {
            int new_i = val.first+row[i];
            int new_j = val.second+col[i];
            if(new_i<0 || new_j<0 || new_i>=data.size() || new_j>=data[0].size()) {
                continue;
            }
            if(used[new_i][new_j] || data[new_i][new_j]==1) {
                continue;
            }
            
            used[new_i][new_j]=true;
            path.push_back({new_i,new_j});
            dfs(data,used,path);
            used[new_i][new_j]=false;
            path.pop_back();
        }
        
        
        
    }
    
    // 这里写一个bfs
    
    void bfs(vector<vector<int>>& data,vector<vector<bool>>& used,queue<vector<pair<int,int>>>& que) { // used的作用是为了防止回头路
        while(!que.empty()) {
            int size = que.size();
            for(int i=0;i<size;i++) {
                auto path = que.front();
                que.pop();
                auto val = path.back();
                for(int i=0;i<4;i++){
                    int new_i = val.first+row[i];
                    int new_j = val.second+col[i];
                    if(new_i<0 || new_j<0 || new_i>=data.size() || new_j>=data[0].size()) {
                    continue;
                    }
                    if(used[new_i][new_j] || data[new_i][new_j]==1) {
                        continue;
                    }
                    used[new_i][new_j]=true;
                    path.push_back({new_i,new_j});
                    if(new_i==data.size()-1 && new_j==data[0].size()-1) {
                        res=path;
                        Show();
                        return;
                    }
                    que.push(path);
                    path.pop_back(); // 不能影响其他人,que里面存放的就是路径
                }
                
            }
        }
        
    }
    
    
    void Show() {
        for(auto a: res) {
            cout<<"("<<a.first<<","<<a.second<<")"<<endl;
        }
    }
    
    vector<pair<int,int>> res;
    int maxlength=1000;
};


int main() {
    int row, col;
    while(cin>>row && cin>>col) {
        if(row==0 && col==0) {
            continue;
        }
        vector<vector<int>> data(row,vector<int>(col,0));
        for(int i=0;i<row;i++) {
            for(int j=0;j<col;j++) {
                int val ;
                cin>>val;
                data[i][j]=val;
            }
        }
//         for(auto a:data) {
//             for(auto b:a) {
//                 cout<<b<<" ";
//             }
//             cout<<endl;
//         }
        Slove s;
        vector<vector<bool>> used(row,vector<bool>(col,false));
        vector<pair<int, int>> path;
        path.push_back({0,0});
        
//        dfs解法
//         s.dfs(data,used, path);
//         s.Show();
        // bfs解法
        queue<vector<pair<int,int>>> que;
        que.push(path);
        s.bfs(data, used, que);
        
        
    }
}





香橙派rk3588的rknn多线程推理RTSP流服务性能优化与资源分配策略 本文深入探讨了香橙派RK3588平台上的RKNN多线程推理在RTSP流服务中的性能优化与资源分配策略。通过分析硬件架构、设计多线程推理流水线、实现NPU核心负载均衡及优化RGA内存管理,显著提升了RTSP视频流的处理帧率和降低了延迟,为边缘计算视频分析应用提供了实用的优化方案。 阅读详情

相关推荐

Spring WebFlux响应式编程实战(三):优雅处理异常与高效调试技巧

本文深入探讨了Spring WebFlux响应式编程中的异常处理与调试技巧。文章通过电商订单流处理场景,详细解析了Reactor核心操作符onErrorReturn、onErrorResume和onErrorMap的实战应用,并介绍了如何构建@ControllerAdvice和WebExceptionHandler全局异常处理防线。同时,提供了使用.log()操作符、Hooks.onOperatorDebug()及BlockHound进行高效调试的方法,旨在帮助开发者构建健壮、可维护的响应式应用。

weixin_29252171的博客 67

HJ43迷宫问题

首先解决一下需要用到的知识: 1.BFS:常用来解决最短路径以及涉及最小、最大等问题,比DFS更优。 DFS:常用来判断能否找到出口、解。 【ps:如果 路径唯一,DFS来解决最短路径问题也是可以的】 2.vector<vector<int>>v(n,vector<int>(m,0)): v中包含n个vector<int>类型数据,vector<int>(m,0)表示包含m个0。 3.vector<pair<int,int&

qq_57328462的博客 751

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

华为机试:HJ43 迷宫问题

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据范围: 2≤n,m≤10 , 输入的内容只包含 0≤val≤1。函数使用深度优先搜索算法来遍历迷宫,并将找到的路径添加到。数组来表示可以移动的方向,这里只有两个方向:向右和向下。这个程序首先从输入中读取迷宫的大小和内容,然后调用。左上角到右下角的最短路径,格式如样例所示。

倚楼听风雨的博客 658

20240128 C#与SCPI协议实战:轻量级仪器控制库ScpiNet应用指南

本文详细介绍了轻量级C#库ScpiNet在仪器控制中的应用。相较于传统的NI-VISA,ScpiNet无需安装庞大运行时,通过纯C#实现直接与USB或以太网设备通信,支持跨厂商SCPI仪器。文章提供了从快速连接到实战封装、错误处理的完整指南,帮助开发者构建简洁高效的自动化测试系统。

h9j8k7l6m5n的博客 548

AD18 PCB模块的Copy

在PCB布局时,时常会将元器件先分模块进行排布,最后才会进行总体的布局,在局部布局的时候,想要移动一个模块的器件总是很麻烦,需要选中全部才能进行移动,有些时候还有选漏的情况,所以会将局部布局的模块把它看做一个整体进行移动,效果如下,元件,布线,铜皮,过孔以及元件编号的位置摆放都和源模块一模一样。4、再选中需要复用的模块内的元件,按照第3步的顺序排序,粘贴刚刚复制的Channel Offset参数。在PCB布局时,有多个模块原理图是一模一样的情况,我们可以只画一个模块,之后灵活应用模块,进行copy。

qq_53859658的博客 3239

华为机考:HJ43 迷宫问题

从迷宫入口开始进行dfs搜索,每次进入一个点,将其加入临时路径数组中,把该位改成0表示不能进入,然后依次搜索该位下、右、上、左四个方向的点,如果搜索的这个点可以进入则路径进入,如果四个方向都没有可以走的路表示此路不通,回溯——删去路径最后一个,重置该位为0. 找到横纵坐标都等于矩阵最后一位则表示找到路径,复制现有路径然后返回。

yuanshenzhilu的博客 1520

别再对着数据手册发愁了!用HFSS 2023 R2搞定ESP32-C3板载天线的阻抗匹配

本文详细介绍了如何利用HFSS 2023 R2进行ESP32-C3板载天线的阻抗匹配优化,解决实际PCB设计中常见的性能偏差问题。通过智能模型导入、科学参数扫描和量化优化流程,显著提升天线性能,适用于WIFI和蓝牙应用场景。

weixin_42523543的博客 448

华为机试-043-中等-HJ43.迷宫问题

【代码】华为机试-043-中等-HJ43.迷宫问题

tttzzzqqq2018的博客 426

C#上位机实战:PLC与检测设备无缝对接,构建产品质量实时判定系统

本文分享了基于C#开发的汽车零部件质量检测系统实现经验。系统采用三层架构:设备层(PLC/视觉相机/三坐标)、通信层(OPC UA/SDK/串口)和应用层(数据采集/判定/存储)。重点解决了三大技术难点:1)通过OPC UA订阅模式将PLC通信延迟从500ms降至50ms;2)反编译厂商Demo破解视觉SDK对接难题;3)采用时间戳+产品ID实现多设备数据同步。系统上线后质检人员减少67%,误判率降至0.5%,数据追溯效率显著提升。文章强调工业场景下稳定性优先于技术复杂度,实用经验值得借鉴。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 799

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1729

【Python】牛客HJ43迷宫问题

DFS牛逼!

SpriteNym的博客 1108

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 282

HJ43 迷宫问题

HJ43 迷宫问题

NEFU AB-IN's Blog 332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

牛客HJ43迷宫问题 - 创建智能体通过策略自己找路

思路 * 前进策略: 一直靠着左侧的墙壁走 * 假设初始方向为col的方向 * 如果能向左走,直接向左转弯,并向前走一步; * 否则依次尝试:向前走、向右走。注意: * 向前走时不需要修改当前的前进方向 * 尝试向右走时,无论是否能够向右走出一步,都直接向右转方向,这样连续转几次,就能转出死角 * 当 当前位置 等于 出口位置时结束 * 通过删除重复不必要的足迹使路径最短——已知了只有一条通路

ReaderWithNoEmotion 1170

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

DFS算法解决HJ43 迷宫问题

每个方格要么是可以通过的空方格 ‘0’ ,要么是不可通过的墙方格 ‘1’‘1’ ,特别的,网格的四周都是墙方格,你可以沿着空方格上下左右随意移动:从 (x,y)(x,y) 向上移动一格即抵达 (x−1,y)、向下移动一格即抵达 (x+1,y)、向左移动一格即抵达 (x,y−1) 、向右移动一格即抵达 (x,y+1)。你需要保证输出的路径是符合题目要求的,即从起点 (0,0)(0,0) 出发,到达终点 (h−1,w−1)(h−1,w−1) ,且路径上每个单元格都是空方格,行走的单元格都是彼此相邻的。

2301_81193552的博客 648

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ACM. HJ43 迷宫问题 ●●

HJ43 迷宫问题 ●●

chenyfan_blog 499

【编程题 深度优先遍历 】HJ43 迷宫问题(详细注释 易懂)

定义一个二维数组 N*M ,它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 数据范围:2 ......

qq_51901495的博客 1132

H.迷宫,(算法选修)

我的思路是开一个数组,存储障碍,再开一个数组用dfs将每一个火扩散到每一个位置的时间记录下来,然后再开一个记录自己时间的数组,然后进行dfs,如果不是障碍,不越界,并且自己的时间小于火到的时间,那么就放进去,如果能到那个位置,就输出,否则输出t—t,但是注意这里有一个特判,不难但是很容易漏掉,如果你到达终点,那么你的时间和火的时间重合也是没问题的。然后是k行整数ai,bi,表是在(ai,bi)的位置上有一堵墙。迷宫可以看作是一个二维的地图,范围是n * m (1

q619718的博客 3181

华为机试 HJ43 迷宫问题 C语言解决(小白版本,便于理解)

华为机试 HJ43 迷宫问题 C语言解决(小白版本,便于理解)

m0_64234778的博客 6006

HJ 43 迷宫问题

描述 定义一个二维数组 N*M ,如 5×5 数组下所示: intmaze[5][5]={ 0,1,0,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 数据范围: 2≤n,m≤10, 输入的内容只包含 0≤val≤1 ...

HelenZhaoUS的博客 361

《华为机试》刷题之HJ43 迷宫问题

一、题目 二、示例 三、代码 # 代码1 def fun(i, j, pos=[]): if j+1 < n and temp[i][j+1] == 0: # 向右 if (i, j+1) not in pos: fun(i, j+1, pos + [(i,j+1)]) if j-1 >= 0 and temp[i][j-1] == 0: # 向左 if (i, j-1) not in pos:

胡萝卜 1252

【牛客网】HJ43 迷宫问题(动态规划)

题目链接: https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc?tpId=37&&tqId=21266&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking import java.util.*; import java.io.*; class Node{ int x; int y; public Node

LX__dream的博客 2101
上一篇: c++之malloc底层实现
下一篇: 详解Cookie与Session
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值