在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → c++ 迷宫问题(给出迷宫,制动寻径问题)实例源码下载

c++ 迷宫问题(给出迷宫,制动寻径问题)实例源码下载

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:1.19M
  • 下载次数:34
  • 浏览次数:643
  • 发布时间:2016-04-22
  • 实例类别:C/C++语言基础
  • 发 布 人:信徒
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 迷宫

实例介绍

【实例简介】

【实例截图】

【核心代码】

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>//因为要产生随机函数种子
#include <windows.h>//因为要用Sleep延时函数

#define MAX_X 20  //定义迷宫大小
#define MAX_Y 30

int maze[MAX_X][MAX_Y];

class stack_for_maze//迷宫行走路线存储专用栈类!
{
private:
 struct node//结点用来记录压栈的迷宫坐标
 {
  int x;
  int y;
  char direction; //上一步的行走方向(即如何来到这里的)   
  node* next;
 };
 node* head;
public:
 stack_for_maze()
 {
  head=NULL;
 }
 ~stack_for_maze()
 {
  node* p=head;
  while(head!=NULL)
  {
   head=head->next;
   delete p;
   p=head;
  }
 }
 void push(int xx,int yy,char ddirection)//压栈,将坐标和行走方向压栈
 {
  node* new_node;
  new_node=new node;
  if(new_node!=NULL)
  {
   new_node->x=xx;
   new_node->y=yy;
   new_node->direction=ddirection;
   new_node->next=NULL;
   
   if(head==NULL)
    head=new_node;
   else
   {
    new_node->next=head;
    head=new_node;
   }  
  }
  else
   cout<<"\n因为内存分配失败导致本次压栈失败!!!\n";
 }
 node* pop(int& xx,int& yy)//出栈时带回栈顶元素坐标
 {
  if(head!=NULL)
  {
   node* p=head;
   head=head->next;
   xx=p->x;
   yy=p->y;
   delete p;
  }
  else
  {
   cout<<"\n因为栈已空导致本次出栈失败\n";
  }
  return head;
 }
 void print()//输出栈内元素
 {
  if(head!=NULL)
  {
   node* p=head;
   while(p!=NULL)
   {
    cout<<"  "<<p->x<<"   "<<p->y<<"   "<<p->direction<<endl;
    p=p->next;
   }
  }
  else
   cout<<"\n栈为空,打印失败\n";
 }
};
void CreateMaze()//创建迷宫
{
 int max_way=MAX_X*MAX_Y;//产生通路的参数,值越大障碍越少
 int x,y;

 for(x=0;x<MAX_X;x  )
  for(y=0;y<MAX_Y;y  )
   maze[x][y]=1; //先把迷宫全部设为墙壁

 srand((unsigned)time(NULL));//随机函数种子发生器(以时间做参数)
 for(int i=0;i<=max_way;i  )//随机构建迷宫通路
 {  
  x=rand()%(MAX_X-2) 1;
  y=rand()%(MAX_Y-2) 1;
  maze[x][y]=0;
 }
 
 maze[1][1]=0;//入口
 maze[MAX_X-2][MAX_Y-2]=0;//出口

 maze[0][1]=3;
 maze[MAX_X-1][MAX_Y-2]=0;
}
void PrintMaze()//输出迷宫的当前状态
{
 int x,y;
 system("cls");//清屏
 cout<<endl;
 for(x=0;x<MAX_X;x  )
 {
  for(y=0;y<MAX_Y;y  )
  {
   if(maze[x][y]==0){cout<<"  ";continue;}//通路
   if(maze[x][y]==1){cout<<"■";continue;}//墙
   if(maze[x][y]==2){cout<<"×";continue;}//死胡同
   if(maze[x][y]==3){cout<<"↓";continue;}//向下走
   if(maze[x][y]==4){cout<<"→";continue;}
   if(maze[x][y]==5){cout<<"←";continue;}
   if(maze[x][y]==6){cout<<"↑";continue;}
   if(maze[x][y]==7){cout<<"※";continue;}//当前站立位置
   }
  cout<<endl;
 }
 Sleep(2);//延时函数
}
void move(stack_for_maze &s)
{
 int x=1,y=1;//出发点
 while(1)
 {
  maze[x][y]=2;

  //-----------------------向下
  if(maze[x 1][y]==0)
  {
   s.push(x,y,'D');
   maze[x][y]=3;//将当前位置做一个向下的标记↓用代码3表示
   x=x 1;//向下走到一个新位置
   maze[x][y]=7;//标记当前站立位置为7,用符号※表示
   PrintMaze();
   if((x==MAX_X-1)&&(y==MAX_Y-2))
   {
    s.push(x,y,'*');
    cout<<"\n成功走出!!!\n";
    return;
   }
   else
    continue;
  }

  //-----------------------向右
  if(maze[x][y 1]==0)
  {
   s.push(x,y,'R');
   maze[x][y]=4;//将当前位置做一个向右的标记→用代码4表示
   y=y 1;//向右走到一个新位置
   maze[x][y]=7;//标记当前站立位置为7,用符号※表示
   PrintMaze();
   if((x==MAX_X-1)&&(y==MAX_Y-2))
   {
    s.push(x,y,'*');
    cout<<"\n成功走出!!!\n";
    return;
   }
   else
    continue;
  }

  //-----------------------向上
  if(maze[x-1][y]==0)
  {
   s.push(x,y,'U');//当前位置压栈
   maze[x][y]=6;//将当前位置做一个向上的标记↑用代码6表示
   x=x-1;//向上走到一个新位置
   maze[x][y]=7;//标记当前站立位置为7,用符号※表示
   PrintMaze();
   if((x==MAX_X-1)&&(y==MAX_Y-2))
   {
    s.push(x,y,'*');
    cout<<"\n成功走出!!!\n";
    return;
   }
   else
    continue;
  }

  //-----------------------向左
  if(maze[x][y-1]==0)
  {
   s.push(x,y,'L');
   maze[x][y]=5;//将当前位置做一个向左的标记←用代码5表示
   y=y-1;//向左走到一个新位置
   maze[x][y]=7;//标记当前站立位置为7,用符号※表示
   PrintMaze();
   if((x==MAX_X-1)&&(y==MAX_Y-2))
   {
    s.push(x,y,'*');
    cout<<"\n成功走出!!!\n";
    return;
   }
   else
    continue;
  }

  //--------------------上下左右均不通则回退,即出栈一次,如果出栈导致栈空则说明无路可走了!
  if(s.pop(x,y)==NULL&&maze[x-1][y]!=0&&maze[x][y-1]!=0&&maze[x][y 1]!=0&&maze[x 1][y]!=0)
  {
   cout<<"\n没有找到合适路径!!!\n";
   maze[0][1]=7;//没有找到路,就站在起点吧!
   if(maze[1][1]!=1)maze[1][1]=2;
   return;
  }
 }
}
void main()
{
 CreateMaze();//创建迷宫
 PrintMaze();//输出当前迷宫的初始状态
 stack_for_maze stack;//定义一个栈的对象,用来记录行走路线
 move(stack);//行走中……
 PrintMaze();//输出迷宫的最终状态
 getchar();
 getchar();
}

标签: 迷宫

实例下载地址

c++ 迷宫问题(给出迷宫,制动寻径问题)实例源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警