C语言数据结构之迷宫问题

C语言数据结构之迷宫问题

迷宫问题是一种基本的搜索问题,其中需要在一个矩阵中寻找从起点到终点的路径。在本篇文章中,我们将以C语言为例,介绍迷宫问题的完整攻略。

准备工作

在开始之前,我们先要准备好数据结构。为了表示迷宫,我们使用一个二维数组。其中,0表示可以通过的路,1表示障碍物不可通过。为了记录路径,我们还需要使用一个二维数组来表示每个格子是否已经被访问过。

#define M 10 //迷宫的行数
#define N 10 //迷宫的列数

int maze[M][N] = {
    {0, 1, 0, 0, 0, 1, 0, 1, 0, 0}, 
    {0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
    {0, 0, 0, 1, 0, 1, 0, 1, 0, 1},
    {1, 1, 1, 1, 0, 0, 0, 1, 0, 1},
    {0, 0, 0, 1, 0, 0, 0, 1, 0, 0},
    {0, 1, 0, 1, 1, 1, 1, 1, 1, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 0, 1, 1, 1, 0}
};

int visited[M][N] = {0}; //所有格子未被访问过

搜索算法

接下来我们需要实现搜索算法,寻找从起点到终点的路径。在这里我们使用深度优先搜索算法(DFS)来实现。我们参数为当前位置的行和列,以及目标位置的行和列。

int dfs(int x, int y, int target_x, int target_y) {
    if (x == target_x && y == target_y) //找到路径,返回1
        return 1;
    if (x < 0 || x >= M || y < 0 || y >= N) //越界,返回0
        return 0;
    if (maze[x][y] == 1 || visited[x][y] == 1) //撞到墙或者已经访问过,返回0
        return 0;
    visited[x][y] = 1; //标记格子已被访问
    if (dfs(x-1, y, target_x, target_y) == 1) //向上搜索
        return 1;
    if (dfs(x+1, y, target_x, target_y) == 1) //向下搜索
        return 1;
    if (dfs(x, y-1, target_x, target_y) == 1) //向左搜索
        return 1;
    if (dfs(x, y+1, target_x, target_y) == 1) //向右搜索
        return 1;
    visited[x][y] = 0; //恢复格子未被访问
    return 0; //找不到路径,返回0
}

主函数

最后,我们在主函数中调用上面的dfs函数。以下是寻找从起点(2, 0)到终点(9, 9)的完整代码,并输出路径。

#include <stdio.h>

int main() {
    int start_x = 2, start_y = 0; //起点
    int target_x = 9, target_y = 9; //终点
    int path_found = dfs(start_x, start_y, target_x, target_y);
    if (path_found) {
        printf("Path from (%d,%d) to (%d,%d):\n", start_x,start_y,target_x,target_y);
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (visited[i][j] == 1)
                    printf("(%d,%d) ", i, j);
            }
        }
    } else {
        printf("Path not found\n");
    }
    return 0;
}

示范运行

我们以两个示例来说明迷宫问题的求解过程。

示例一:从起点(1,1)到终点(10,10)

迷宫:

1 1 1 1 1 1 1 1 1 1 
1 0 1 0 0 0 1 0 0 1 
1 0 1 0 1 0 1 1 1 1 
1 0 1 0 1 0 0 0 0 1 
1 0 1 0 1 1 1 1 1 1 
1 0 1 0 0 0 0 0 0 1 
1 0 1 1 1 1 1 1 0 1 
1 0 0 0 0 0 1 0 0 1 
1 1 1 1 1 0 1 0 0 1 
1 1 1 1 1 0 1 1 1 1 

输出:

Path from (1,1) to (10,10):
(1,1) (1,2) (2,2) (3,2) (3,3) (3,4) (3,5) (2,5) (2,6) (1,6) (1,7) (1,8) (2,8) (3,8) (3,9) (3,10) (4,10) (5,10) (6,10) (7,10) (7,9) (8,9) (8,8) (9,8) (10,8) (10,9) (10,10)

示例二:从起点(3,8)到终点(3,1)

迷宫:

1 1 1 1 1 1 1 1 1 1 
1 0 1 0 0 0 1 0 0 1 
1 0 1 0 1 0 1 1 1 1 
1 0 1 0 1 0 0 0 0 1 
1 0 1 0 1 1 1 1 1 1 
1 0 1 0 0 0 0 0 0 1 
1 0 1 1 1 1 1 1 0 1 
1 0 0 0 0 0 1 0 0 1 
1 1 1 1 1 0 1 0 0 1 
1 1 1 1 1 0 1 1 1 1 

输出:

Path from (3,8) to (3,1):
(3,8) (2,8) (1,8) (1,7) (1,6) (2,6) (3,6) (4,6) (4,7) (4,8) (3,8) (3,7) (3,6) (3,5) (3,4) (4,4) (5,4) (5,3) (4,3) (3,3) (2,3) (2,2) (3,2) (3,1)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之迷宫问题 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码 结构体是C语言中最为基础的数据结构之一,它可以将多个数据类型组合成一个整体,方便地进行访问和管理。而结构体数组则是将多个相同结构体类型的变量按照一定规律排列在一起的一种数据结构。本文将详细讲解C语言中结构体数组的使用方法及示例代码。 定义结构体 首先,我们需要定义一个结构体类型。结构体类型需要指定名称、成员变量及其数据类型:…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之2-3-4树

    带你了解Java数据结构和算法之2-3-4树 1. 什么是2-3-4树 2-3-4树是一种自平衡二叉查找树,也叫B树的一种,它可以保持树的平衡,使得每个节点的左右子树高度差最多为1。在2-3-4树中,每个节点可以包含2个、3个或4个子节点,这也是其名称的来源。2-3-4树是B树的特殊形式,通常用于内存储存结构。 2. 2-3-4树的特点 2-3-4树的特点如…

    数据结构 2023年5月17日
    00
  • C语言线性表的顺序表示与实现实例详解

    C语言线性表的顺序表示与实现实例详解 1. 线性表的定义 线性表是一种线性结构,它是由n个数据元素(n≥0)组成的有限序列。当n=0时,我们称为一个空表。 在C语言中,我们可以通过数组来实现线性表的顺序表示,每个数据元素都存在数组的一个位置中,数组下标可以看作是该数据元素的位置。 2. 线性表的基本操作 一个线性表的基本操作有以下几种: 2.1 初始化线性表…

    数据结构 2023年5月17日
    00
  • 详解如何在Go语言中循环数据结构

    请看下面的完整攻略。 如何在Go语言中循环数据结构 在Go语言中,常见的数据结构包括数组、切片、映射、通道、链表等。循环数据结构是编程中常见的操作之一,下面我们将介绍如何在Go语言中循环不同的数据结构。 使用for循环遍历数组 数组是一种拥有固定大小的数据结构,如果我们想要遍历一个数组,可以使用for循环实现。以下是一个数组遍历示例: package mai…

    数据结构 2023年5月17日
    00
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解 LinkedList简介 LinkedList是Java中的一个数据结构,它是一个双向链表,可以提供快速的插入和删除操作。LinkedList中的元素分别保存在每个节点中,每个节点包含了指向前一个节点和后一个节点的引用。 使用LinkedList的好处是,其可以快速的进行插入和删除操作,但是如果需要随机存取中…

    数据结构 2023年5月17日
    00
  • Redis中5种数据结构的使用场景介绍

    下面是详细的攻略: Redis中5种数据结构的使用场景介绍 Redis是一个高性能的无类型的键值数据库,支持多种数据结构。在使用Redis时,了解各种数据结构的使用场景,可以帮助我们更好地使用Redis。 1. String String是Redis最基本的数据结构,可以存储字符串、整数和浮点数,最大长度为512MB。 使用场景: 存储单个值,如用户ID、用…

    数据结构 2023年5月17日
    00
  • Java 数据结构算法Collection接口迭代器示例详解

    Java 数据结构算法 Collection 接口迭代器示例详解 如果你正在学习 Java 编程,那么数据结构和算法一定是一个不可避免的话题。在 Java 中,Collection 框架提供了许多有用的接口和类来管理和操作集合。其中,迭代器 Iterator 是 Collection 中最重要的接口之一,它提供了对集合元素进行迭代的方法。本文将对 Java …

    数据结构 2023年5月17日
    00
  • Java数据结构之优先级队列(堆)图文详解

    Java数据结构之优先级队列(堆)图文详解 什么是优先级队列(堆) 优先级队列(堆)是一种非常重要的数据结构,它能够更好地管理数据,分配任务等。优先级队列的本质就是一种特殊的队列,它是一种可以根据元素的优先级来出队的数据结构。 通常情况下,队列中存储了一系列具有优先级的数据。当我们从队列中取出元素时,优先级高的元素会先出队。因此,我们需要一种数据结构,来对这…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部