C语言 迷宫问题(任意生成地图,展示路径)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void generateMaze(char **maze, int rows, int cols) {
    // 初始化迷宫地图为全部为 '#'
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            maze[i][j] = '#';
        }
    }

    // 随机选择起点和终点(位置不能在边界上)
    srand((unsigned int) time(NULL));
    int start_x, start_y, dest_x, dest_y;
    do {
        start_x = rand() % (rows - 2) + 1;
        start_y = rand() % (cols - 2) + 1;
        dest_x = rand() % (rows - 2) + 1;
        dest_y = rand() % (cols - 2) + 1;
    } while (start_x == dest_x && start_y == dest_y);

    // 生成迷宫
    maze[start_x][start_y] = ' ';         // 起点设为可走
    maze[dest_x][dest_y] = ' ';           // 终点设为可走
    int visited[rows][cols];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            visited[i][j] = 0;
        }
    }
    int dx[4] = {-1, 0, 1, 0};            // 向四个方向移动
    int dy[4] = {0, 1, 0, -1};
    int stack_x[rows * cols], stack_y[rows * cols];  // 模拟栈,用于回溯
    int top = 0;
    stack_x[top] = start_x;
    stack_y[top] = start_y;
    visited[start_x][start_y] = 1;
    while (top >= 0) {
        int x = stack_x[top];
        int y = stack_y[top];
        int flag = 0;
        for (int i = 0; i < 4; i++) {
            int new_x = x + dx[i];
            int new_y = y + dy[i];
            if (new_x >= 1 && new_x < rows - 1 && new_y >= 1 && new_y < cols - 1 &&
                maze[new_x][new_y] == '#' && visited[new_x][new_y] == 0) {
                flag = 1;
                break;
            }
        }
        if (flag) {
            int r = rand() % 4;
            int new_x = x + dx[r];
            int new_y = y + dy[r];
            if (new_x >= 1 && new_x < rows - 1 && new_y >= 1 && new_y < cols - 1 &&
                maze[new_x][new_y] == '#' && visited[new_x][new_y] == 0) {
                maze[(x+new_x)/2][(y+new_y)/2] = ' ';  // 打通两个相邻格子之间的墙
                visited[new_x][new_y] = 1;
                stack_x[++top] = new_x;
                stack_y[top] = new_y;
            }
        } else {
            top--;
        }
    }
}

void printMaze(char **maze, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%c", maze[i][j]);
        }
        printf("\n");
    }
}

void dfs(char **maze, int rows, int cols, int x, int y, int dest_x, int dest_y, int **visited, int *path_x, int *path_y, int *path_len) {
    if (x == dest_x && y == dest_y) {
        *path_len += 1;
        path_x[*path_len] = x;
        path_y[*path_len] = y;
        return;
    }

    visited[x][y] = 1;
    int dx[4] = {-1, 0, 1, 0};  // 向四个方向移动
    int dy[4] = {0, 1, 0, -1};
    for (int i = 0; i < 4; i++) {
        int new_x = x + dx[i];
        int new_y = y + dy[i];
        if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols &&
            maze[new_x][new_y] == ' ' && visited[new_x][new_y] == 0) {
            *path_len += 1;
            path_x[*path_len] = x;
            path_y[*path_len] = y;
            dfs(maze, rows, cols, new_x, new_y, dest_x, dest_y, visited, path_x, path_y, path_len);
            *path_len -= 1;
        }
    }
}

int main() {
    int rows, cols;
    printf("请输入迷宫的行数和列数:");
    scanf("%d %d", &rows, &cols);
    char **maze = (char **) malloc(rows * sizeof(char *));
    for (int i = 0; i < rows; i++) {
        maze[i] = (char *) malloc(cols * sizeof(char));
    }
    generateMaze(maze, rows, cols);
    printMaze(maze, rows, cols);

    // 求解路径
    int **visited = (int **) malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        visited[i] = (int *) malloc(cols * sizeof(int));
        for (int j = 0; j < cols; j++) {
            visited[i][j] = 0;
        }
    }
    int path_x[rows * cols], path_y[rows * cols], path_len = -1;
    dfs(maze, rows, cols, 1, 1, rows-2, cols-2, visited, path_x, path_y, &path_len);

    // 输出路径
    printf("\n正确路径:\n");
    for (int i = path_len; i >= 0; i--) {
        maze[path_x[i]][path_y[i]] = '*';
    }
    printMaze(maze, rows, cols);

    // 释放动态分配的内存
    for (int i = 0; i < rows; i++) {
        free(maze[i]);
        free(visited[i]);
    }
    free(maze);
    free(visited);
    return 0;
}

首先通过 scanf 函数读入迷宫的行数和列数,然后动态分配二维字符数组 maze 以保存迷宫地图。生成迷宫的函数 generateMaze 中,我们增加了两个参数 rowscols,表示迷宫的行数和列数,同时为了避免溢出,使用了动态分配的 visited 数组来代替固定大小的数组。

dfs 函数来实现深度优先搜索,用于求解从起点到终点的路径。在 dfs 函数中,我们首先判断当前点是否为终点,如果是则将其加入路径数组;否则遍历当前点的四个相邻格子,找到可通行的格子并递归搜索下去。在搜索结束后,需要将 visited 数组恢复到原始状态,以便下一次搜索使用。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的C语言程序,它可以随机生成一个迷宫地图: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 // 地图的大小 int map[N][N]; // 地图 void initMap() { // 初始化地图 int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { map[i][j] = 1; // 1 表示可以通过,0 表示障碍 } } } void printMap() { // 打印地图 int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%d ", map[i][j]); } printf("\n"); } } void buildMaze() { // 生成迷宫 int i, j, x, y; int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; // 方向数组 srand((unsigned)time(NULL)); // 设置随机数种子 x = rand() % N; // 随机起点 y = rand() % N; map[x][y] = 0; // 设置起点为障碍 while (1) { int flag = 0; // 标记是否还存在可以拓展的区域 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (map[i][j] == 0) { // 如果当前位置是障碍 for (int k = 0; k < 4; k++) { // 随机拓展四个方向 int nx = i + d[k][0]; int ny = j + d[k][1]; if (nx >= 0 && nx < N && ny >= 0 && ny < N && map[nx][ny] == 1) { // 如果可以拓展 flag = 1; map[nx][ny] = 0; // 设置为障碍 } } } } } if (!flag) { break; // 如果不存在可以拓展的区域,退出循环 } } } int main() { initMap(); // 初始化地图 buildMaze(); // 生成迷宫 printMap(); // 打印地图 return 0; } ``` 这个程序中,我们使用一个二维数组来表示地图,1表示可以通过,0表示障碍。首先我们初始化地图,然后随机选择一个起点,并将其设置为障碍。接下来,我们不断拓展障碍,直到不存在可以拓展的区域为止。在每次拓展时,我们随机选择四个方向之一,如果该方向上的位置是可以通过的,则将其设置为障碍。最终,我们得到了一个随机生成的迷宫地图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值