博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迷宫求解终结版(堆栈的使用)第三季
阅读量:6154 次
发布时间:2019-06-21

本文共 2825 字,大约阅读时间需要 9 分钟。

迷宫求解最后的终结版,哎呀,这老迷宫我终于完结了!!!

话不多说,看程序吧!!!亲:

#include<iostream>

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#define LEN sizeof(struct Stack)
#define INT_SIZE 1000
#define INCREMENT 100
using namespace std;

int a[100][100];

typedef struct
{
int x;
 int y;
}Posttype;//定义结构体表明当前位置的状态

 

 

 

typedef struct

{
 int di;  //表此位置指向的方向
 Posttype seat;//当前位置的坐标
 int ord; //当前位置在路径中的序号
}ElemType;//记录行走的路径

 

struct Stack{
 ElemType *base;//栈底指针
 ElemType *top;//栈顶指针
 int StackSize;//栈的尺寸
}stack;//构建数据栈结构体

 

 

bool FindWay(struct Stack &S,int i,int j)//找道函数
{
    Posttype NextPos(Posttype a,int Dir);  
 void PushStack(struct Stack &S,ElemType e);
 ElemType PopStack(struct Stack &S);
 Posttype curpos;
 ElemType e;
 int curstep=0;
 curpos.x=i;
 curpos.y=j;
 do
 {
  if(a[curpos.x][curpos.y]==-1)
    return true;
  if(a[curpos.x][curpos.y]==0||a[curpos.x][curpos.y]==2)
  {
   a[curpos.x][curpos.y]=1;
            e.di=1;
   e.ord=curstep;
   e.seat=curpos;  
         PushStack(S,e);
  
      curpos=NextPos(curpos, 1);
   curstep++;
  }
  else
  {
  
      if(e.di==4&&S.base!=S.top)
               e=PopStack(S);   
            if(e.di<4)
      {
              e.di++;                       //换下一个方向探索    
              curpos=NextPos(e.seat, e.di); //当前位置设为新方向的相邻块
      }
  } 
 }while(S.base!=S.top-1);
  return false;
}                                                                                              

  

 

 

 
Posttype NextPos(Posttype a,int Dir)//寻路函数
{
  
 
   switch(Dir)
   {
         case 1:a.x=a.x-1;break;
   case 2:a.y=a.y+1;break;
   case 3:a.x=a.x+1;break;
   case 4:a.y=a.y-1;break;
   }
  return a;
}

    

 

void InitStack(struct Stack &S)//栈的初始化

{
 S.base=(ElemType *)malloc(INT_SIZE*sizeof(ElemType));
 if(S.base==NULL)
 {
  printf("系统出现错误,请关闭后重新启动\n");
  exit(0);
 }
 S.top=S.base;
 S.top++;
 S.StackSize=1000;
}

  

void PushStack(struct Stack &S,ElemType e)//元素入栈
{
 if(S.top-S.base>=S.StackSize)
 {
  printf("由于存储空间已经满了,系统自动增加了存储空间\n");
  S.top=(ElemType *)realloc(S.base,(INT_SIZE+INCREMENT)*sizeof(ElemType));
 }

  *S.top=e;

  S.top++;
 
 

}

 
 
ElemType PopStack(struct Stack &S)//元素出栈
{
 ElemType e;
 if(S.top==S.base)
  exit(0);
     e=*(S.top-2);
      S.top--;
   return e;
}

 

 

 

int main()//主函数
{

 int line,rows,i,j,starti,startj,endi,endj;

 printf("欢迎使用本迷宫求解系统\n");
 printf("---------------------------------------------------\n");
 printf("请输入迷宫的行数和列数:\n");
    cin>>line>>rows;
 memset(a,0,sizeof(a));
 for(i=0,j=0;i<line;i++)
   a[i][j]=1;
    for(i=0,j=0;j<rows;j++)
   a[i][j]=1;
    for(i=0,j=rows-1;i<line;i++)
   a[i][j]=1;
    for(i=line-1,j=0;j<rows;j++)
   a[i][j]=1;
 printf("请输入障碍点坐标的个数:\n");
 int n,m;
 cin>>n;
    m=n;
 while(m--)
 {
  printf("请输入第%d个障碍点的坐标:\n",n-m);
        cin>>i>>j;
  a[i][j]=1;
 }
 printf("请输入迷宫起始点的坐标:\n");
       cin>>starti>>startj;
    a[starti][startj]=2;
 printf("请输入迷宫出口点的坐标:\n");
    cin>>endi>>endj;
    a[endi][endj]=-1;
    struct Stack S;
    InitStack(S);
 i=starti;
 j=startj;
    if(FindWay(S,i,j))
 {
  printf("恭喜您,我们已经找到了一条通道\n");
     cout<<"("<<endi<<","<<endj<<")"<<endl;
  S.top--;
  while(S.base!=S.top)
    {
     cout<<"("<<(*S.top).seat.x<<","<<(*S.top).seat.y<<")"<<endl;
        PopStack(S);
    }
      
 }
    else
 printf("抱歉,此迷宫没有出路\n");
 printf("---------------------------------------------------\n");

 

      

 return 0;
}

 

 

 

转载地址:http://mzbfa.baihongyu.com/

你可能感兴趣的文章
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
前端第七天
查看>>
图解SSH原理及两种登录方法
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
416. Partition Equal Subset Sum
查看>>
app内部H5测试点总结
查看>>