织芜 2024-02-19 15:33 采纳率: 72%
浏览 9
已结题

C++递归分割生成迷宫,结果不对

C++递归分割生成迷宫,结果不对

namespace RecurseDivide{
    void divide(Maze& m,int left,int right,int top,int bottom);

    Maze generate(int row,int col){
        Maze result(row,col);
        divide(result,0,col-1,0,row-1);
        return result;
    }

    void divide(Maze& m,int left,int right,int top,int bottom){
        if(right-left<1||bottom-top<1){
            return;
        }

        int x=rand()%(right-left)+left;
        int y=rand()%(bottom-top)+top;

        int upRd=rand()%(y-top+1)+top;
        int downRd=rand()%(bottom-y)+y;
        int leftRd=rand()%(x-left+1)+left;
        int rightRd=rand()%(right-x)+right;

        int dire=rand()%4; //0-左 1-右 2-上 3-下
        switch (dire)
        {
        case 0:{
            m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
            m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
            m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
            break;
        }
        case 1:{
            m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
            m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
            m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
            break;
        }
        case 2:{
            m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
            m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
            m.connect(downRd*(m.Col())+x,downRd*(m.Col())+x+1);
            break;
        }
        case 3:{
            m.connect((y+1)*(m.Col())+leftRd,y*(m.Col())+leftRd);
            m.connect((y+1)*(m.Col())+rightRd,y*(m.Col())+rightRd);
            m.connect(upRd*(m.Col())+x,upRd*(m.Col())+x+1);
            break;
        }
        default:
            break;
        }

        //左上
        divide(m,left,x,top,y);
        //右上(x,x+1为衔接处)
        divide(m,x+1,right,top,y);
        //左下
        divide(m,left,x,y+1,bottom);
        //右下
        divide(m,x+1,right,y+1,bottom);
    }

生成的迷宫通路非常少
而且调试的时候还会于connect函数发生段错误越界,因为10x10的迷宫测试中,connect函数有连接过100和90,100显然越界了,但是不知道为什么出现100

  • 写回答

3条回答 默认 最新

  • bobhuang 2024-02-19 18:16
    关注

    这行代码有可能超出边界:

            int rightRd=rand()%(right-x)+right;
    

    当right = 9, rand() % (right-x) > 0时

    按上文的语义,猜测应该是:

            int rightRd=rand()%(right-x)+x;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月27日
  • 已采纳回答 2月19日
  • 创建了问题 2月19日

悬赏问题

  • ¥15 python深度学习代码求跑
  • ¥100 对接美团闪购医药接口相关问题
  • ¥15 嵌入式软件电子烟开发
  • ¥15 职场 Excel 查重问题
  • ¥15 求怎么用idea2021.3.2创建web项目并配置tomcat
  • ¥100 or-tools的相关问题
  • ¥15 有可能用平板通过拓展坞来烧录程序吗(keil5的那种)
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决