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日

相关文章

  • PHP 数据结构 算法 三元组 Triplet

    PHP 数据结构 算法 三元组 Triplet 什么是三元组 Triplet 三元组 Triplet 是指由三个数据分别确定一个元素的数据类型。 在 PHP 中可以用一个数组来实现三元组,数组下标表示元素的序号,数组中储存的则是元素的值,共有三个元素。 例如一个三元组 (a, b, c),可以用 PHP 数组表示为 $triplet = array(a, b…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • C语言数据结构哈希表详解

    C语言数据结构哈希表详解 什么是哈希表? 哈希表(Hash Table)是一种采用散列函数(hash函数)将数据映射到一个固定长度的数组中,并且以 O(1) 的时间复杂度进行数据插入、查找、删除操作的数据结构。哈希表主要由以下三个组成部分构成:- 数组:用于存储映射到对应下标上的数据。- 散列函数:将数据映射到数组下标上的规则。- 冲突处理方式:当不同的数据…

    数据结构 2023年5月16日
    00
  • C++实现数据结构的顺序表详解

    C++实现数据结构的顺序表详解 介绍 在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。 创建顺序表 顺序表可以使用数组来实现。下面的代码展示了如何创建…

    数据结构 2023年5月17日
    00
  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现 1. KMP算法的概述 KMP算法的全称是Knuth-Morris-Pratt算法,是一种字符串匹配算法,用于在文本串S内查找一个模式串P的出现位置。它的特点是在P和S两个序列中,当匹配失败时,它会跳过P的部分已匹配的字符,利用这个信息来减少S和P之间的匹配次数,从而提高匹配效率。 2. KMP算法的实现 2.1 预处理失…

    数据结构 2023年5月17日
    00
  • 使用JavaScript实现链表的数据结构的代码

    要使用JavaScript实现链表数据结构,需要考虑以下几个方面: 链表的基本结构 链表的基本操作(插入、删除、遍历等) JavaScript 实现数据结构的具体步骤 下面我将逐一阐述。 链表的基本结构 链表是由一系列节点所组成的数据结构,每个节点都保存着下一个节点的引用关系。链表可以是单向的,也可以是双向的。单向链表的节点只有指向下一个节点的指针,而双向链…

    数据结构 2023年5月17日
    00
  • C语言链表详解及代码分析

    C语言链表详解及代码分析 简介 链表是一种常见的数据结构,它主要用于存储线性数据结构,可以动态地进行添加和删除操作。在C语言中,链表可以通过链式存储结构来实现。本篇攻略将详细讲解C语言链表的实现,包括定义链表、节点、添加节点、删除节点等操作。 链表的定义 链表由一个个节点组成,每个节点包含两个信息:数据和指向下一个节点的指针。在C语言中,可以通过结构体实现每…

    数据结构 2023年5月17日
    00
  • java实现数据结构单链表示例(java单链表)

    下面是 Java 实现数据结构单链表的完整攻略。 简介 单链表是数据结构中的一种,用于存储一组有序的元素。单链表中,每个元素都由一个结点表示,结点中包含了一个指向下一个结点的指针。单链表的结构更加灵活,支持插入、删除等操作。 实现步骤 1. 定义节点类ListNode 单链表的每一个节点包含两个属性,分别是节点值 val 和指向下一个节点的指针 next,所…

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