使用 C 语言实现字符走迷宫 DFS算法应用

news2024/9/23 16:12:31

使用 C 语言实现字符走迷宫 DFS算法应用

请添加图片描述

迷宫问题是一个经典的编程问题,通常用于算法训练。我们将通过使用 C 语言来实现一个字符迷宫的求解,其中玩家可以控制字符在迷宫中移动,直到找到出口。

1. 问题描述

我们将设计一个二维迷宫,其中 "0" 表示空地,"1" 表示墙壁,"S" 是起点,"E" 是终点。玩家的目标是从起点出发,找到一条通往终点的路径。

迷宫示例:

S 0 1 0 0
1 0 1 0 1
0 0 0 0 0
1 1 0 1 E

2. 实现思路

我们将用深度优先搜索(DFS)来解决这个问题。DFS 是一种递归的搜索算法,它会从起点出发,沿着一条路径前进,直到遇到障碍物或走到终点。如果当前路径无法走通,算法会回溯到上一步,继续寻找其他路径。

主要步骤:

  1. 设计迷宫数据结构。
  2. 编写 DFS 算法寻找路径。
  3. 打印出找到的路径或提示无解。

3. 代码实现

3.1 数据结构设计

我们可以用一个二维数组来表示迷宫。通过定义一个结构体存储迷宫的基本信息。

#include <stdio.h>

#define ROWS 4
#define COLS 5

char maze[ROWS][COLS] = {
    {'S', '0', '1', '0', '0'},
    {'1', '0', '1', '0', '1'},
    {'0', '0', '0', '0', '0'},
    {'1', '1', '0', '1', 'E'}
};

int visited[ROWS][COLS] = {0};  // 标记访问过的点

3.2 深度优先搜索(DFS)

DFS 的核心是递归。在每次递归中,我们会从当前位置出发,依次尝试上下左右四个方向。如果找到出口 E,递归返回成功。如果所有路径都走不通,返回失败。

int isSafe(int x, int y) {
    return (x >= 0 && x < ROWS && y >= 0 && y < COLS && 
            maze[x][y] != '1' && visited[x][y] == 0);
}

int DFS(int x, int y) {
    if (maze[x][y] == 'E') {  // 找到终点
        return 1;
    }
    
    // 标记当前点为已访问
    visited[x][y] = 1;

    // 上下左右四个方向
    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};

    for (int i = 0; i < 4; i++) {
        int newX = x + dx[i];
        int newY = y + dy[i];

        if (isSafe(newX, newY)) {
            if (DFS(newX, newY)) {
                return 1;
            }
        }
    }

    // 回溯
    visited[x][y] = 0;
    return 0;
}

3.3 程序入口

在主函数中调用 DFS 搜索起点 'S',并输出结果。

int main() {
    int startX, startY;

    // 寻找起点 'S'
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (maze[i][j] == 'S') {
                startX = i;
                startY = j;
                break;
            }
        }
    }

    // 使用 DFS 查找路径
    if (DFS(startX, startY)) {
        printf("找到出口!\n");
    } else {
        printf("无路可走!\n");
    }

    return 0;
}

4. 运行结果

程序会自动从起点 'S' 开始,寻找通向终点 'E' 的路径。如果找到出口,输出 "找到出口!",否则输出 "无路可走!"

运行示例:

找到出口!

5. 结论

通过使用深度优先搜索算法,我们成功实现了一个简单的字符迷宫求解器。该程序的扩展性强,可以根据不同的迷宫地图进行测试。未来可以考虑加入更多的功能,如输出完整路径、改进用户交互等。

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

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

相关文章

Unity--AnimationCurve动画曲线设置

参考文章&#xff1a;https://blog.csdn.net/qq_20179331/article/details/131309128 打开Clip文件点击Curves选项&#xff0c;选中想要编辑的动作关键帧&#xff0c;右键选择Auto 这样动画就变成线性的了

爆改YOLOv8 |利用 iAFF迭代注意力改进C2f,高效涨点

1&#xff0c;本文介绍 iAFF的核心思想是通过细致的注意力机制优化特征融合&#xff0c;从而提升卷积神经网络的性能。它不仅解决了因尺度和语义不一致导致的特征融合问题&#xff0c;还引入了多尺度通道注意力模块&#xff0c;提供了一个统一且通用的特征融合方案。此外&…

二分查找算法:朴素二分+左右边界二分力扣实战应用

目录&#xff1a; 1、二分查找算法简介 2、算法原理及时间复杂度分析 2.1 朴素二分算法 3.2 查找左右边界的二分算法 3.2.1 查找左边界 3.2.2 查找右边界 3.3 时间复杂度分析 3、二分查找算法模版 3.1 朴素二分模版 3.2 查找左右边界的二分模版 4、算法应用【leetco…

企业收款码,自动统计职员绩效-微信支付商家版

一、企业收款码 在快节奏的商业世界中&#xff0c;效率与精准是企业成功的关键。微信支付商家版企业收款码&#xff0c;为你开启全新的绩效统计时代。 告别繁琐的传统统计方式&#xff0c;无需再耗费大量时间人工整理数据。企业收款码自动统计职员绩效&#xff0c;每一笔交易都…

Cortex-A7的GIC(通用中断控制器):中断处理状态机

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 中断处理状态机 1.1 中断处理状态说明及状态机转换图 说明&#xff1a; Inactive&#xff1a;未激活&#xff0c;中断无效。中断非挂起或非激活。 Pending&#xff1a;挂起&a…

iZotope Ozone 11 Advanced:专业音频制作与母带处理的巅峰之作

iZotope Ozone 11 Advanced是一款专为音频工程师、制作人和音乐人设计的顶级音频后期制作软件&#xff0c;无论是Mac还是Windows平台&#xff0c;都能为用户提供无与伦比的音频处理体验。该软件集成了最先进的人工智能技术和一系列精密的音频处理工具&#xff0c;让音频作品的最…

还在烦恼Cosplay论坛开发?探索PHP+Vue的完美解决方案!

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

STM32定时器PWM输出

STM32定时器PWM&#xff08;脉冲宽度调制&#xff09;输出原理&#xff0c;在使用固件库时&#xff0c;主要涉及定时器的配置以及PWM信号的生成。以下是对该原理的详细解释&#xff1a; 一、PWM基本概念 PWM&#xff08;Pulse Width Modulation&#xff09;是一种通过改变脉冲…

docker 容器内文件传到宿主机上

sudo docker cp 容器名&#xff1a;文件路径 宿主机路径 ylshy-Super-Server:~$ pwd /home/yl ylshy-Super-Server:~$ ^C ylshy-Super-Server:~$ sudo docker cp ylafl:/opt/live555/testProgs/rtsp.pcap /home/yl Successfully copied 4.61kB to /home/yl ylshy-Super-Server…

自适应学习率(Datawhale X 李宏毅苹果书 AI夏令营)

传统的梯度下降方法在优化过程中常常面临学习率设置不当的问题。固定的学习率在训练初期可能过大&#xff0c;导致模型训练不稳定&#xff0c;而在后期可能过小&#xff0c;导致训练速度缓慢。为了克服这些问题&#xff0c;自适应学习率方法应运而生。这些方法通过动态调整学习…

Django使用视图动态输出CSV以及PDF的操作详解例子解析

代码示例&#xff1a; 在Django中&#xff0c;使用视图动态输出CSV和PDF文件是一个常见的需求&#xff0c;可以通过Python标准库中的csv模块和reportLab库来实现。以下是一些详细的操作步骤和示例代码。 CSV文件的动态输出 首先&#xff0c;需要导入Python的csv模块&#xf…

JSP的九大内置对象及其作用详解

JSP的九大内置对象及其作用详解 1. request对象2. response对象3. pageContext对象4. session对象5. application对象6. out对象7. config对象8. page对象9. exception对象 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JSP&#xff08…

<数据集>骨折检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2060张 标注数量(xml文件个数)&#xff1a;2060 标注数量(txt文件个数)&#xff1a;2060 标注类别数&#xff1a;7 标注类别名称&#xff1a;[elbow positive, shoulder fracture, fingers positive, wrist positi…

0818-0824面试题目和复习整理

根据面试问的问题整理一下 1. 并查集 int n 1005; // n根据题目中节点数量而定&#xff0c;一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一种数组结构// 并查集初始化 void init() {for (int i 0; i < n; i) {father[i] i;…

Kubernetes部署相关概念

本文封面由 凯楠&#x1f4f8;友情提供 Kubernetes部署相关概念概览 容器运行时&#xff08;container runtime&#xff09;&#xff1a; 是负责在计算机操作系统上创建、运行和管理容器的软件组件。它是整个容器化环境中的关键组成部分&#xff0c;与操作系统内核紧密交互&a…

linux(Ubuntu )搭C++ 最新版GDAL完整教程

在前面的文章中主要是介绍如何在windows系统下利用python安装gdal库&#xff0c;如下&#xff1a; 如何快速安装GDAL 在linux环境下python安装gdal也可以利用现成的whl文件&#xff0c;但是安装c GDAL环境的比较麻烦&#xff0c;目前网络上大多是安装的老版本的教程&#xff…

springboot3 SecurityConfig SecurityFilterChain 需要使用CorsFilter,实际是CorsWebFilter

使用springboot3做微服务开发&#xff0c;由于网关gateway使用webFlux&#xff0c;因此导致实际类型是CorsWebFilter&#xff0c;但是在public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception方法中&#xff0c;项目启动报错…

rt-studio+clion+cubemx联合使用(使用scons进行整合)

前言 以前在clion中使用rt-thread的方式 1. 使用的cubemx生成的方式: 这种方式只能使用rt-thread的内核版本 2. 自己去把rt-thread的源码拷贝到对应的工程中&#xff0c;再编写对应的CMakelists文件进行管理思考 我的想法是通过rt-studio创建项目&#xff0c;然后通过工具转…

河南萌新2024第二场

H 狼狼的备忘录 题目大意&#xff1a; 给定n本备忘录&#xff0c;里面记录了一个人的m个星座信息&#xff0c;要求按一下要求整理备忘录 A&#xff1a;同一个成员的星座信息 x 是星座信息 y 的后缀&#xff0c;那么星座信息 x 会没有星座信息 y 完整&#xff0c;从而应该只保…

Nginx + Docker Compose前后端分离部署到服务器过程记录

一、采用Nginx部署前端VUE&#xff08;Vite&#xff09; 1、修改配置文件vite.config.ts&#xff0c;将本地环境改为开发环境 注意base处只能是‘/’ 不能是 ‘./!在这里插入图片描述 对项目进行打包 在当前目录的终端执行&#xff1a;npm run build 若报错如下&#xff1…