迷宫问题

迷宫问题的三种求解方法(递归求解、回溯求解和队列求解) 目录 一、迷宫问题的三种求解方法 递归求解 回溯求解 队列求解 二、华为迷宫问题 一、迷宫问题的三种求解方法 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。 在介绍具体算法之前,先考虑将迷宫数字化。这里将迷宫用一个二维的list存储(即list嵌套在list里),将不可到达的位置用1表示,可到达的位置用0表示,并将已经到过的位置用... 阅读详情

Description
定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
第一眼看到这个题目的时候,觉得还挺好搞,然后路径就吃屎了。然后用dfs的方法暴力搞,反正5*5.现在想一想,在结构体里加一个数,记录上一个位置,用链表,或者1,2,3,4代表四个方向的操作,都可以,好多方法。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int a[6][6], dp[30][30], leap[30][30], flag = 0;
int dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
struct Node{
    int x;
    int y;
};
queue<Node>p;
void dfs(int x,int y)
{
    int i, tempx, tempy;
    if (x == 1 && y == 1)
    {
        flag = 1;
    }
    else{
        for (i = 0; i < 4; i++)
        {
            tempx = x + dir[i][0]; tempy = y + dir[i][1];
            if (tempx >= 1 && tempy >= 1 && tempx <= 5 && tempy <= 5)
            {
                if (leap[tempx][tempy] && dp[tempx][tempy] == dp[x][y] - 1)
                {
                    dfs(tempx, tempy);
                    if (flag)
                    {
                        cout << "("<<tempx-1 << ", " << tempy-1 <<")"<< endl;
                        return;
                    }
                }
            }
        }
    }
}
int main()
{
    int i, j, m, n, ans;
    Node temp, now;
    for (i = 1; i <= 5;i++)
    for (j = 1; j <= 5; j++)
    {
        cin >> a[i][j];
        leap[i][j] = 0;
    }
    temp.x = temp.y = 1;
    dp[1][1] = 0;
    leap[1][1] = 1;
    p.push(temp);
    while (p.size())
    {
        temp = p.front();
        for (i = 0; i < 4; i++)
        {
            now.x = temp.x + dir[i][0];
            now.y = temp.y + dir[i][1];
            if (now.x >= 1 && now.x <= 5 && now.y >= 1 && now.y <= 5)
            {
                if (!leap[now.x][now.y] && a[now.x][now.y] == 0)
                {
                    dp[now.x][now.y] = dp[temp.x][temp.y] + 1;
                    p.push(now);
                    leap[now.x][now.y] = 1;
                }
            }
        }
        p.pop();
    }
    dfs(5,5);
    cout << "(4, 4)" << endl;
    return 0;
}
【C数据结构】迷宫问题 文章目录一、迷宫问题的思路二、简单迷宫的代码实现三、地下迷宫问题的思路四、地下迷宫的代码实现 前言:本章记录作者学习中,遇到的两个比较有趣的问题,一个简单和一个较复杂的迷宫问题。     一、迷宫问题的思路 让我们先来看简单的:迷宫问题 它的具体要求: 输入描述: 输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。 如 5 5 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 阅读详情

相关推荐

栈的应用 —— 迷宫问题

题目 这是几个由二维数组构成的迷宫,简单的迷宫,多通路不带环的迷宫,多通路带环的迷宫!对于简单迷宫我们需要判断是否有出口!对于多通路不带环的迷宫我们需要确定出口并且判断最短路径,对于通路间带环的迷宫我们需要找出最短路径! 算法思想:回溯 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜...

一枚野生程序员 —— Tim 3万+

回溯算法之迷宫问题(Maze)

回溯算法之迷宫问题前言算法思路一、回溯算法二、经典问题之迷宫问题(Maze)(一)问题阐述 前言     迷宫问题是回溯算法的经典问题 算法思路 一、回溯算法     回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜素尝试过程中寻找问题的解,当发现已满足求解条件时,就“回溯”返回,尝试别的路径。     回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标,但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种不通就回退再走的技术称为回溯法,而满足回溯条件的某个状态的点称为“回

YING—country的博客 1万+

C语言求解迷宫问题

迷宫问题求解 https://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc 以上迷宫OJ题曾经是百度某一年的其中一个笔试题, 迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口, 走的过程中我们借助栈记录走过路径的坐标,栈记录坐标有两方面的作用, 一方面是记录走过的路径,一方面方便走到死路时进行回溯找其他的通路。 输入两个整数,分别表示二维数组的行数,列数。 再输入相应的数组,其中的1表示墙壁,

evoke_c的博客 9466

K - 迷宫问题

题目描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组...

逐梦er的博客 2229

用栈实现迷宫问题

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 500 //栈最大的容量 #define MAXLENGTH 20//设置最大的行和列是20 20*20 typedef struct{ int x; int y; }PosType;//PosType 坐标类型的变量PosType typedef struct { int ord;//用于存放路线 PosTy

weixin_45613730的博客 4249

求解迷宫问题(队列)

目录 算法描述 用一个队列q来存储记录走过的坐标 经过多次记录后: 对应的迷宫路径示意图如下: 则读出来的迷宫路径坐标如下: 我们开始敲代码吧: 代码部分 准备工作: 1. 建立迷宫 **//对应的数组下标 0 1 2 3 4 5 6 7 8 9** int a[][10]={ 1,1,1,1,1,1,1,1,1,1, 1,-1,1,0,0,0,1,1,1,1,//起点为-1 ...

Nothing_Wzy的博客 6036

【算法】迷宫问题

迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口,走的过程中我们借助栈记录走过路径的坐标。栈记录坐标有两方面的作用,一方面是记录走过的路径,一方面方便走到死路时进行回溯找其他的通路。

chuxinchangcun的博客 4224

java实现迷宫问题

迷宫问题 对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更 愿意使用“紧贴墙壁,靠右行走”的简单规则。 58 下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。 假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。 这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。 仔细分析代码中的逻辑,填充缺少的部分。把填...

南 墙 1万+

用C语言解决迷宫问题

迷宫问题是栈这一块很经典的问题。 迷宫大致可分为三种,简单迷宫、多通路迷宫:通路间不带环、多通路迷宫:通路间带环,其中带环多通路迷宫是最复杂的,解决它,要把栈与递归结合起来,下来我们来一个一个分析吧,先从简单迷宫开始。 简单迷宫 要解决这个问题并不难,我们只要从入口进入,当然要先检测这个入口是不是合法并且能不能走的通,如果走的通,把当前这一步的位置入栈,并且把它标记为2,然后继续向当前这...

Calm的博客 5万+

回溯法解决迷宫问题

迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。1.设计思路我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。2.剖析实例例如,我们给定下面这样的迷宫:1 1 1 1 1 1 1 1 1 1 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

宇哲 7291

用栈和递归求解迷宫问题

一、问题概述 小时候,我们都玩过走迷宫的游戏吧。看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹,  检测当前位置是否是通路,是否可以通过,直至找到出口位置,才是迷宫的正确轨迹。如若走到死胡  同里,则必须返回重新选择路径走。  我们来模拟一下迷宫问题,我们的迷宫是这样的: 哈哈~虽然有点low!但是可以帮助我们解决实

xxpresent的博客 1万+

迷宫问题,迷宫最优路径——(C语言)

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

2401_83456040的博客 2780

迷宫问题求解

1、问题描述: 迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。老鼠经多次试验终于得到它学习走迷宫的路线。 2、设计功能要求: 迷宫由m行n列的二维数组设置,0表示无障碍,1表示有障碍。设入口为(1,1),出口为(m,n),每次只能从一个无障碍单元移到周围四个方向上任一无障碍单元。编程实现对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

迷宫问题详解

迷宫问题详解 迷宫问题指的是:在给定区域内,找到一条甚至所有从某个位置到另一个位置的移动路线。举个简单的例子,如图 1 所示,在白色区域内找到一条(甚至所有)从起点到终点的路线。 图 1 迷宫问题 迷宫问题就可以采用回溯算法解决,即从起点开始,采用不断“回溯”的方式逐一试探所有的移动路线,最终找到可以到达终点的路线。 回溯算法解决迷宫问题 以图 1 所示的迷宫为例,回溯算法解决此问题的具体思路是: 从当前位置开始,分别判断是否可以向 4 个方向(上、下、左、右)移动: 选择一个方向并移动到下个位置。判断此

ccc369639963的博客 2628

Cursor+Apifox MCP Server实战:5分钟搞定API自动化测试用例生成

本文详细介绍了如何利用Cursor IDE与Apifox MCP Server,在5分钟内将API文档自动转化为高质量的自动化测试用例。通过配置MCP Server建立数据桥梁,开发者可直接用自然语言指令,让AI基于真实接口规范生成可立即执行的pytest测试代码,大幅提升接口测试效率,特别适合快节奏的SaaS项目。

ooo22的博客 533

cordic算法的FPGA实现

cordic 算法的MATLAB仿真及verilog实现

qq_38360574的博客 1674

DFS递归之迷宫问题

DFS递归之迷宫问题: 1.能否逃出迷宫; 2.逃出迷宫的最短路径; 3.缺口迷宫。

Tom的博客 4977

STM32F407 CubeMX UART DMA高效解析BNO085九轴数据

本文详细介绍了如何在STM32F407平台上使用CubeMX配置UART和DMA高效解析BNO085九轴传感器数据。通过DMA循环接收机制实现低CPU占用的实时数据采集,并分享数据解析技巧、错误处理及实战调试经验,为嵌入式开发者提供完整解决方案。

o4p5q6r7s的博客 234

十二、迷宫问题

十二、迷宫问题 文章目录十二、迷宫问题题目描述 题目描述 迷宫有一个入口,一个出口。一个人从入口走进迷宫,目标是找到出口。阴影部分和迷宫的外框为墙,每一步走一格,每格有四个可走的方向,探索顺序为地图方向:南(下)、东(右)、北(上)、西(左)。 输入:输入迷宫数组。第一行数据表示一个 n*n (n<=100)的迷宫;第二行开始的n行为迷宫数据。 其中:0表示路,1表示墙,起点在左上角 <1,1> 的位置,终点在右下角 <n,n> 的位置。 输出:若有解,输出从入口到出

qq_42582489的博客 2992

别再乱调栅极电阻了!手把手教你用示波器调试FOC驱动MOS管,避开EMC和震荡坑

本文详细介绍了FOC驱动中MOS管栅极参数的精准调试方法,涵盖示波器配置、波形特征分析及栅极电阻选型策略。通过实战案例和工程经验,帮助工程师有效解决EMC和震荡问题,提升驱动电路稳定性和效率。

weixin_28728495的博客 502

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 328

迷宫问题解法汇总

from:http://www.cnblogs.com/rollenholt/archive/2011/08/23/2151202.html java写的回溯法求迷宫问题 问题描述: [实验目的] 综合运用数组、递归等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力。 [实验内容及要求] 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程

basycai的博客 1万+

Oracle EBS 帐套(Ledger/SOB)如何定义会计主体、如何支撑多准则 / 多报告、组织与帐套的绑定关系、以及项目落地时的设计差异。下面从实现逻辑、核心要素、组织模型、多账簿、科目设计、项

本文对比了Oracle EBS R12与SAP S/4HANA在帐套(Ledger)设计上的核心差异。Oracle采用4C架构(科目/币种/日历/准则),帐套作为独立会计主体,主辅账物理隔离;SAP则以公司代码为主体,通过平行分类账在同一凭证中实现多准则核算。关键差异体现在:Oracle强调边界隔离,适合差异大的集团;SAP注重统一视图,适合实时合并需求。实施时需注意:Oracle避免过度建账套,SAP需统筹科目与维度设计。两者分别体现了"盒子"与"滤镜"的设计哲学。

金牌架构师 415
上一篇: Fire!
下一篇: Oil Deposits
Techay
博客等级 码龄11年 11粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值