迷宫(C++)

#include<iostream>
#include<ctime>
#include<stack>
#include<windows.h>
using namespace std;

int NUM1= 20;
int NUM2= 20;
const int East  = 0;
const int South = 1;
const int West  = 2;
const int North = 3;
const int pause = 50; //间隔时间
static int count=1;
class Maze
{
public:
    Maze(int h, int w);
    ~Maze();
    void display();
    bool hasCrossOver();
 void WalkMaze();
private:
    int row;
    int col;
    char **p;
    void Init();
};

Maze::Maze(int h,int w):row(h),col(w)
{
    p=new char *[row];
    for(int i=0;i<row;++i)
        p[i]=new char[col];
    Init();
}

Maze::~Maze()
{
    for(int i=0;i<row;i++)
        delete []p[i];
    delete []p;
}


void Maze::display()
{
    for(int i=0;i<row;++i)
    {
        for(int j=0;j<col;++j)
            cout<<p[i][j];
        cout<<endl;
    }
}

void Maze::Init() //随机生成迷宫
{
    srand(time(0)); 
    for(int i=0;i<row;++i)
    {
        for(int j=0;j<col;++j)
        {
            if((i==0)||(j==0)||(i==row-1)||(j==col-1))//加上墙壁
            {
                p[i][j]='*';
                continue;
            }
            if(rand()%100<80)
                p[i][j]='0';
            else
                p[i][j]='1';
        }
    }
    p[1][1]='m';
}
void Maze::WalkMaze()
{
 int num=1;
 for(int i=0;i<NUM1;i++)
 {
  for(int j=0;j<NUM2;j++)
  {
   if(p[i][j]=='m')
   {
    cout<<"第"<<num<<"步走过的点是: ("<<i<<","<<j<<")"<<endl;
    num++;
   }
  }
  cout<<endl;
 }
}
bool Maze::hasCrossOver()
{
    int   flag, i=1,j=1;
    stack<int> s;
    while(true)
    {
  //判断是否可以向东(右)
        if((j+1<col-1)&&(p[i][j+1]=='0'))
        {
            p[i][++j] = 'm';
            s.push(East);
        }
        //判断是否可以向南(下)
        else if((i+1 < row-1) && (p[i+1][j] == '0'))
   {
    p[++i][j] = 'm';
    s.push(South);
   }
   //判断是否可以向西(左)
   else if((j-1 > 0) && (p[i][j-1] == '0'))
    {
     p[i][--j] = 'm';
     s.push(West);
    }
    //判断是否可以向北(上)
    else if((i-1 > 0) && (p[i-1][j] == '0'))
     {
      p[--i][j] = 'm';
      s.push(North);
     }
     else
     {
      if(s.empty())
       return false;
      flag = s.top();
      s.pop();
      switch (flag)
      {
       case East:
        --j; break;
       case South:
        --i; break;
       case West:
        ++j; break;
       case North:
        ++i; break;
      }
     }


        if(i==row-2 && j==col-2)
        {
            int m, n;
            stack<int> newStack;
            while(!s.empty())
            {
                newStack.push(s.top());
                s.pop();
            }
   
            for(m=0;m<row;++m)
            {
                for(n=0;n<col;++n)
    {
                    if(p[m][n] == 'm')
                        p[m][n] = '0';
    }
   
   }
  
   m = 1;
   n = 1;
   p[m][n]='m';
   while(!newStack.empty())
   {
    flag=newStack.top();
    switch(flag)
    {
                    case East:
                        ++n; break;
                    case South:
                        ++m; break;
                    case West:
                        --n; break;
                    case North:
                        --m; break;
    }
    p[m][n] = 'm';
    Sleep(pause);  //windows.h
    ++count;
    system("cls");
    display();
    newStack.pop();
   }
   return true;
  }//end if;
  
 }//end while
}

void main()
{
    Maze gMaze(NUM1,NUM2);
    gMaze.display();
    system("pause");//等待
    if (gMaze.hasCrossOver())
 {
  cout<<"总共走了"<<count<<"步"<<endl;
        cout << "经过的下标节点是:"<< endl;
  gMaze.WalkMaze();
 }
    else
        cout << "/n无通路" << endl;
 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include<iostream> #include<windows.h> #include "conio.h" using namespace std; const int m=10 ; //迷宫行数 const int n=15 ; //迷宫列数 struct migong //结构体迷宫,,,pre为前驱,,,xy 为当前目标 { int x,y; int pre; }sq[500]; //最大成员500个,,迷宫大小,,,,, int mg[m+2][n+2]; //迷宫数组 外带边2个 ,, int zx[8+1],zy[8+1]; //迷宫方向数组 九宫格,,,他在中间,,,所以8个方向 void printlj(int rear) //打印迷宫路径 { int i; i=rear; //保存当前节点前驱,,为了在,,向前试探失败时,返回,,换一个方向继续 do { cout<<sq[i].x<<sq[i].y; //输出当前,,X,y值,,其实就是地址。。。。 i=sq[i].pre; // 保存这个节点的前驱 }while(i!=0); //i!=0表示通路 } void mglj() //球迷宫最短路径 { int i,j,x,y,v,front,rear,found; sq[1].x=sq[1].y=1;sq[1].pre=0; //从(1,1)开始搜索 。。。。左上角开始 found=0; //初始化。 front=rear=1; //初始化 mg[1][1]=-1; //开始节点就不需要来回遍历了,,,不设为-1,,一样可以算,,对于CPU来说无所谓 while((front<=rear)&&(!found)) //found初始化,,等于0 ,,,,这里是一个BUG,,,因为找到了,,他就退出了,,,很多时候不止一条路径 { x=sq[front].x; // y=sq[front].y; //引入临时变量x,y,,,保存当前,,,因为下面要进行,,,查找遍历,,,为了能够回到当前节点,,在无法试探的情况下 for(v=1;v<=8;v++) //循环扫描8个方向 {
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值