本文介绍使用 C 语言实现迷宫求解算法,利用深度优先搜索策略,从迷宫入口出发,按照右、下、左、上的顺序搜索可行路径,最终判断是否存在从入口到出口的路径,并输出路径信息。

问题描述

输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10] 来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入。若读入迷宫大小的值是 n(3<n<=10),则该迷宫横向或纵向尺寸都是 n,规定迷宫最外面的一圈是障碍物,迷宫的入口是 maze[1][1],出口是 maze[n-2][n-2]。若 maze[i][j] = 1 代表该位置是障碍物,若 maze[i][j] = 0 代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口 maze[1][1] 到出口 maze[n-2][n-2] 可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探。

代码实现

#include <stdio.h>

#define MAX_SIZE 10

int maze[MAX_SIZE][MAX_SIZE];
int path[MAX_SIZE][MAX_SIZE];

int solveMaze(int x, int y, int size) {
    // 到达出口
    if (x == size - 2 && y == size - 2) {
        path[x][y] = 1;
        return 1;
    }
    
    // 检查当前位置是否可以通过
    if (maze[x][y] == 0 && path[x][y] == 0) {
        path[x][y] = 1;

        // 向右搜索
        if (solveMaze(x, y + 1, size) == 1) {
            return 1;
        }
        // 向下搜索
        if (solveMaze(x + 1, y, size) == 1) {
            return 1;
        }
        // 向左搜索
        if (solveMaze(x, y - 1, size) == 1) {
            return 1;
        }
        // 向上搜索
        if (solveMaze(x - 1, y, size) == 1) {
            return 1;
        }

        // 若四个方向都无法到达出口,则将当前位置标记为不可行
        path[x][y] = 0;
        return 0;
    }
    
    return 0;
}

int main() {
    int size;
    printf("请输入迷宫的大小(3<n<=10): ");
    scanf("%d", &size);
    
    printf("请按行输入迷宫的内容(0表示可行,1表示障碍):
");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &maze[i][j]);
            path[i][j] = 0;
        }
    }
    
    printf("寻找迷宫路径...
");
    if (solveMaze(1, 1, size) == 1) {
        printf("迷宫路径存在!
");
        printf("路径如下:
");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                printf("%d ", path[i][j]);
            }
            printf("
");
        }
    } else {
        printf("迷宫路径不存在!
");
    }
    
    return 0;
}

代码分析

该代码通过递归的方式搜索迷宫中的路径,从入口开始,按照向右、向下、向左、向上的顺序依次尝试移动。如果某个方向可以到达出口,则返回1。如果四个方向都无法到达出口,则返回0。程序将找到的路径标记在path数组中,其中1表示路径可行,0表示不可行。

函数说明

  • solveMaze(int x, int y, int size):该函数用于递归搜索迷宫路径,参数 xy 代表当前位置的坐标,size 代表迷宫的大小。

代码示例

请输入迷宫的大小(3<n<=10): 5
请按行输入迷宫的内容(0表示可行,1表示障碍):
1 1 1 1 1
1 0 0 0 1
1 0 1 0 1
1 0 0 0 1
1 1 1 1 1
寻找迷宫路径...
迷宫路径存在!
路径如下:
0 0 0 0 0
0 1 1 1 0
0 1 0 1 0
0 1 1 1 0
0 0 0 0 0

总结

本文介绍了使用 C 语言实现迷宫求解算法,并给出了代码示例。该算法利用深度优先搜索策略,从入口开始,按照指定的顺序搜索可行路径,最终判断是否存在从入口到出口的路径,并输出路径信息。代码简洁易懂,可以作为学习 C 语言编程和算法的参考。

注意

  • 本文中的代码仅供参考,您需要根据具体的需求进行修改和调整。
  • 在实际应用中,您可能需要考虑迷宫的复杂程度、效率等因素,选择更合适的算法和数据结构。
C语言实现迷宫求解算法:深度优先搜索

原文地址: https://www.cveoy.top/t/topic/cuUq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录