• C++随机迷宫生成[转载]


    原文:http://tieba.baidu.com/p/2596809144

    #include<iostream.h>
    #include"time.h"
    #include"stdlib.h"
    
    const char road = ' ';
    const char wall = 'w';
    const char connect = 1;
    const char began = 26;
    const char end = 26;
    const char path = '.';
    const char up = 24;
    const char down = 25;
    const char right = 26;
    const char left = 27;
    const char walked =wall;
    
    
    void Outmaze(int size,char **block);
    void Modify(int size,char ** block);
    void Join(int size,char ** block);
    
    char ** InitializeMaze(int size)
    {//this function used to create a random maze 
    
    //create a 2D array to store the maze 
    char **block=new char*[size] ;
    for(int n=0;n<size;n++)
    {
    block[n]=new char[size];
    }
    
    //initialize the 2D array
    for(int i=0;i<size;i++)
    {
    for(int j=0;j<size;j++)
    {
    if(i%2==0&&j%2==0)
    {
    block[i][j]=road;
    }
    if(i%2!=0&&j%2!=0)
    {
    block[i][j]=wall;
    }
    else
    {
    if(i%2!=0||j%2!=0)
    {
    if(rand()%2<1)
    {
    block[i][j]=road;
    }
    else
    {
    block[i][j]=wall;
    }
    }
    } 
    }
    }
    
    //but the 2D array is not a maze , we should modify it 
    Modify(size,block);
    
    return block;
    }
    
    void Outmaze(int size,char **block)
    {//output the maze
    
    //output the top bound
    for(int m=0;m<size*2+3;m++)
    cout<<connect;
    cout<<endl;
    
    for(int i=0;i<size;i++)
    {
    
    for(int j=0;j<size;j++)
    {
    if(j==0)
    {//output the left bound
    cout<<connect<<' ';
    }
    
    cout<<block[i][j]<<' ';
    
    if(j==size-1)
    {//output the right bound
    cout<<connect;
    }
    }
    cout<<endl;
    }
    
    //output the bottom bound
    for(int n=0;n<size*2+3;n++)
    cout<<connect;
    cout<<endl;
    }
    
    bool TestConnect(int size,int x,int y,char ** block)
    {//test wether exists the problem of close
    
    int n=0;
    
    if((x-1<0)||(block[x-1][y]==connect)){n++;}
    
    if((x+1>size-1)||(block[x+1][y]==connect)){n++;}
    
    if((y-1<0)||(block[x][y-1]==connect)){n++;}
    
    if((y+1>size-1)||(block[x][y+1]==connect)){n++;}
    
    if(n>=2)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    
    int TagConnect(int size,int x,int y,char ** block)
    {//tag the walls that connected to the bound as "connect"
    
    //tag the walls and solve problem of close 
    if((block[x][y]==wall)&&(!TestConnect(size,x,y,block)))
    {//if the block is wall and is not close then tag it as "connect"
    block[x][y]=connect;
    }
    else
    {//if the block cause close then tag it as "road"
    block[x][y]=road;
    return 0;
    }
    
    //go along four directs to continue this work
    if((x-1>=0)&&block[x-1][y]==wall)
    TagConnect(size,x-1,y,block);//go up
    if((x+1<=size-1)&&block[x+1][y]==wall)
    TagConnect(size,x+1,y,block);//go down 
    if((y-1>=0)&&block[x][y-1]==wall)
    TagConnect(size,x,y-1,block);//go left
    if((y+1<=size-1)&&block[x][y+1]==wall)
    TagConnect(size,x,y+1,block);//go right
    return 0;
    }
    
    void Modify(int size,char ** block)
    {//modify the array to be a maze 
    
    //tag the walls that connected to the bound
    for(int i=1;i<size-1;i=i+2)
    {
    TagConnect(size,i,size-1,block);//from the right bound
    TagConnect(size,i,0,block);//from the left bound
    TagConnect(size,size-1,i,block);//from the bottom bound
    TagConnect(size,0,i,block);//from the top bound
    }
    
    //there still some walls which are isolation (not connect to any bounds),we have to solve the problem
    Join(size,block);
    }
    
    void Join(int size,char ** block)
    {//connect the walls that are isolation to the bound
    
    for(int i=0;i<size-1;i++)
    {
    for(int j=0;j<size-1;j++)
    {
    if(block[i][j]==road&&!(i%2==0&&j%2==0)&&!(i%2!=0&&j%2!=0))
    {
    
    if(!TestConnect(size,i,j,block))
    {
    block[i][j]=wall;
    TagConnect(size,i,j,block);
    }
    }
    }
    }
    }
    
    bool FindPath(int size,int x,int y ,int o,int p,char ** block)
    {//find the path of the maze. x,y are the coordinate of the began point 
    // and o,p are the coordinate of the end point 
    
    if((x==o)&&(y==p)) 
    {
    block[x][y]=3;
    return true;
    }
    
    block[x][y]=walked;
    
    if((x-1>=0)&&block[x-1][y]==road)
    {
    if(FindPath(size,x-1,y,o,p,block))
    {
    block[x][y]=up;
    return true;
    }
    }
    
    if((x+1<=size-1)&&block[x+1][y]==road)
    {
    if(FindPath(size,x+1,y,o,p,block))
    {
    block[x][y]=down;
    return true;
    }
    }
    
    if((y-1>=0)&&block[x][y-1]==road)
    {
    if(FindPath(size,x,y-1,o,p,block))
    {
    block[x][y]=left;
    return true;
    }
    }
    
    if((y+1<=size-1)&&block[x][y+1]==road)
    {
    if(FindPath(size,x,y+1,o,p,block))
    {
    block[x][y]=right;
    return true;
    }
    }
    
    block[x][y]=road; 
    
    return false;
    }
    
    main()
    {
    do
    { 
    cout<<"welcome !"<<endl;
    srand((unsigned int) time(0));
    cout<<"please input the size of the maze:"<<endl;
    int size;
    cin>>size;
    size=size/2*2+1;
    char ** block=InitializeMaze(size);
    block[0][0]=began;
    block[size-1][size-1]=end;
    Outmaze(size,block);
    
    cout<<"press any key to show answer!"<<endl;
    char n;
    cin>>n;
    block[size-1][size-1]=road;
    FindPath(size,0,0,size-1,size-1,block);
    Outmaze(size,block);
    
    }while(true);
    return 0;
    }

    路径:

  • 相关阅读:
    nginx 之 proxy_redirect详解【转】
    Gitee整改之思考
    YCFramework版本更新:V1.0.8
    Android 调整屏幕分辩率
    [RxJS] mergeMap, concatMap, exhaustMap: execute order
    [HTML 5] Page Visibility API
    [Angular 14] Providers in Angular Route
    [Typescript] Awaited Type
    [Angular 14] Inject() function
    圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
  • 原文地址:https://www.cnblogs.com/qiangua/p/3467768.html
Copyright © 2020-2023  润新知