凯H 2023-06-04 21:18 采纳率: 81%
浏览 193
已结题

用C语言随机生成一个迷宫

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

//定义迷宫大小
#define ROW 10
#define COL 10

//定义节点状态
#define WALL 0
#define PATH 1

//初始化迷宫
int maze[ROW][COL] = { {0} };

//生成迷宫
int createMaze(int row, int col)
{
    //设置起点和终点
    maze[0][0] = PATH;
    maze[row - 1][col - 1] = PATH;

    //设置当前位置和方向
    int x = 0, y = 0, dir = 0;

    //定义四个方向上的偏移量
    int dx[4] = { 0, 1, 0, -1 };
    int dy[4] = { -1, 0, 1, 0 };

    //随机生成路径
    while (1)
    {
        //寻找当前节点的邻居节点
        int neighbor[4] = { 0 };
        int count = 0;
        int i;
        for (i = 0; i < 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL)
            {
                neighbor[count++] = i;
            }
        }
        //如果当前节点没有可访问的邻居节点,则回溯
        if (count == 0)
        {
            int flag = 0;
            for (i = 0; i < 4; i++)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH)
                {
                    neighbor[count++] = i;
                    flag = 1;
                }
            }
            if (flag == 0) break;
        }

        //随机选择一个邻居节点
        int index = neighbor[rand() % count];
        x += dx[index];
        y += dy[index];
        maze[x][y] = PATH;
    }
    return 0;
}

//打印迷宫
int printMaze(int row, int col)
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (maze[i][j] == WALL)
                printf("■");
            if (maze[i][j] == PATH)
                printf("  ");
        }
        printf("\n");
    }
    return 0;
}
int main()
{
    srand(time(NULL)); //初始化随机数生成器
    createMaze(ROW, COL);
    printMaze(ROW, COL);
    return 0;
}

运行后只出现黑窗,无内容

  • 写回答

10条回答 默认 最新

  • CF2301_77400554X 2023-06-04 21:46
    关注

    引用chatgpt部分指引作答:
    运行结果:

    img


    我注意到在生成迷宫的代码中,当回溯到起点时,程序会陷入无限循环。这是因为在回溯时,没有将当前节点标记为已访问。为了解决这个问题,你可以在回溯时将当前节点标记为已访问(即将maze[x][y]的值设为PATH),以避免重复回溯到同一个节点。下面是修改后的代码:

    #include<stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    //定义迷宫大小
    #define ROW 10
    #define COL 10
    
    //定义节点状态
    #define WALL 0
    #define PATH 1
    #define VISITED 2
    
    //初始化迷宫
    int maze[ROW][COL] = { {0} };
    
    //生成迷宫
    int createMaze(int row, int col)
    {
        //设置起点和终点
        maze[0][0] = PATH;
        maze[row - 1][col - 1] = PATH;
    
        //设置当前位置和方向
        int x = 0, y = 0, dir = 0;
    
        //定义四个方向上的偏移量
        int dx[4] = { 0, 1, 0, -1 };
        int dy[4] = { -1, 0, 1, 0 };
    
        //随机生成路径
        while (1)
        {
            //将当前节点标记为已访问
            maze[x][y] = VISITED;
    
            //寻找当前节点的邻居节点
            int neighbor[4] = { 0 };
            int count = 0;
            int i;
            for (i = 0; i < 4; i++)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL)
                {
                    neighbor[count++] = i;
                }
            }
            //如果当前节点没有可访问的邻居节点,则回溯
            if (count == 0)
            {
                int flag = 0;
                for (i = 0; i < 4; i++)
                {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH)
                    {
                        neighbor[count++] = i;
                        flag = 1;
                    }
                }
                if (flag == 0) break;
            }
    
            //随机选择一个邻居节点
            int index = neighbor[rand() % count];
            x += dx[index];
            y += dy[index];
            maze[x][y] = PATH;
        }
        return 0;
    }
    
    //打印迷宫
    int printMaze(int row, int col)
    {
        int i, j;
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                if (maze[i][j] == WALL)
                    printf("■");
                if (maze[i][j] == PATH)
                    printf("  ");
            }
            printf("\n");
        }
        return 0;
    }
    
    int main()
    {
        srand(time(NULL)); //初始化随机数生成器
        createMaze(ROW, COL);
        printMaze(ROW, COL);
        return 0;
    }
    

    现在,代码应该可以成功生成并打印迷宫了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 已采纳回答 6月5日
  • 创建了问题 6月4日

悬赏问题

  • ¥20 qtcreat 使用msvc编译器开发软件运行时字体锯齿感严重
  • ¥15 c#直接使用C++ 写的class 后续
  • ¥15 为何显示keyerror fruit
  • ¥15 关于#stm32#的问题:/* User can add his own implementation to report the HAL error return state */
  • ¥15 imageware粗糙度表面
  • ¥15 python使用pulp线性优化时报错
  • ¥15 为什么我的uibot导入py模块出错呀。py文件放在了uibot里对应的python文件夹了,卸了重安也不行
  • ¥15 开源或低价数据中台哪个最好
  • ¥15 arduino编程出现字符串疑似覆盖现象
  • ¥15 我的b站在没有碰到屏幕的情况下偶尔会自动跳出进度条,就像在屏幕上点了一下一样,但我并没有点。而且视频进度并没有变。这可能是什么原因造成的?