fdfaafe
fdfaafe
采纳率0%
2021-05-09 04:24 阅读 180
已结题

Java,用prim算法创造一个随机生成的迷宫

50

Java,用prim算法创造一个随机生成的迷宫,墙和道路分别用0和1来表示,只有一个入口但可以有一个或者两个出口,请用二维数组构建迷宫,迷宫的长和宽由使用者来输入(如果需要,可以假设长和宽相等,而且长和宽大于5) 。在保证代码有效的情况下代码越简单越好 给初学者看的 请给代码写注解

  • 点赞
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • software7503 CSDN专家-赖老师(软件之家) 2021-05-09 06:29

    我来尝试写一下,感觉有点难度哦。

    点赞 评论 复制链接分享
  • technologist_32 CSDN专家-Time 2021-05-09 09:04
    点赞 评论 复制链接分享
  • benbenli benbenli 2021-05-09 08:31

    有现成的代码抄:https://www.codenong.com/18242689/ 

    点赞 评论 复制链接分享
  • weixin_43863744 橙子树下 2021-05-09 23:41

     c++版本的,验证有效,效果完全符合你的要求,若非要java格式可以再联系(感觉实在没啥必要,毕竟c++和java都是面向对象,设计思路这里没啥不同的,希望可以采纳)

    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    #define m 51//row
    #define n 51//column
    #define down 1
    #define right 2
    #define left 4
    #define up 8
    vector <int> block_row;
    vector <int> block_column;
    vector <int> block_direct;
    typedef struct point
    {
        int x;
        int y;
    }Point;
    Point start,end;
    int x_num=1;
    int y_num=1;
    int a[m+2][n+2];
    void init(){//将地图全部置1=wall
        for(int i=0;i<=m+1;i++){
            for(int j=0;j<=n+1;j++){
                a[i][j]=1;//wall
            }
        }
    }
    void push(int x,int y,int direct){//把一组数据存放进三个vector容器中
        block_row.push_back(x);
        block_column.push_back(y);
        block_direct.push_back(direct);
    }
    int count(){//计算当前位置周围 墙的个数
        int cnt=0;
        if(x_num+1<=m){
            push(x_num+1,y_num,down);
            cnt++;
        } //down
        if(y_num+1<=n){
            push(x_num,y_num+1,right);
            cnt++;
        } //right
        if(x_num-1>=1){
            push(x_num-1,y_num,up);
            cnt++;
        } //up
        if(y_num-1>=1){
            push(x_num,y_num-1,left);
            cnt++;
        } //left
        return cnt;
    }
    int main(){
        start.x=1;//定义起始点
        start.y=1;
        end.x=m;
        end.y=n;
        init();
        srand((unsigned)time(NULL));//随机数种子
        count();
        a[1][1]=2;
        while(block_row.size()){//第一步压入两堵墙(起点右边和起点下面)进入循环
            int num=block_row.size();
            int randnum=rand()%num;//生成0-num-1之间的随机数,同时也是vector里的下标
            x_num=block_row[randnum];//下面这两行可以不写
            y_num=block_column[randnum];
            switch(block_direct[randnum]){//选择一个方向进行后续操作,起始点 邻块 目标块 三块区域在同一直线上 随后移动到目标块的位置
                case down:{
                    x_num=block_row[randnum]+1;
                    y_num=block_column[randnum];
                    break;
                }
                case right:{
                    x_num=block_row[randnum];
                    y_num=block_column[randnum]+1;
                    break;  
                }
                case left:{
                    x_num=block_row[randnum];
                    y_num=block_column[randnum]-1;
                    break;
                }
                case up:{
                    x_num=block_row[randnum]-1;
                    y_num=block_column[randnum];
                    break;
                }
            }
            if(a[x_num][y_num]==1){//目标块如果是墙
                a[block_row[randnum]][block_column[randnum]]=2;//打通墙
                a[x_num][y_num]=2;//打通目标块
                count();//再次计算当前位置周围的邻墙个数并保存进vector
            }           
            block_row.erase(block_row.begin()+randnum);//删除这堵墙(把用不了的墙删了,对于那些已经施工过了不必再施工了,同时也是确保我们能跳出循环)
            block_column.erase(block_column.begin()+randnum);
            block_direct.erase(block_direct.begin()+randnum);
        }
        for(int i=0;i<=m+1;i++){
            for(int j=0;j<=n+1;j++){
                if(a[i][j]==2){
                    printf("* ");
                }
                else{
                    printf("1 ");
                }
            }
            printf("\n");
        }
        return 0;
    }
    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-05-10 11:10

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-05-11 15:55

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    点赞 评论 复制链接分享

相关推荐