迷宫程序(5)

来源:互联网 发布:超级妖孽软件 编辑:程序博客网 时间:2024/06/04 18:47
#include<iostream.h>#include<stdio.h> #include<stdlib.h> #include<conio.h>#define increasesize 10 //栈的增长长度#define stackinitsize 100//栈的基础长度#define maxi 10 //矩阵的长度#define maxj 10//矩阵的宽度typedef struct { int *base; int *top; int stacksize;//栈的总长度(包括栈的增长长度)}stack; void InitStack(stack &s){ s.base=(int*)malloc(sizeof(int)*stackinitsize); //分配一段内存空间大小为stackinitsize乘sizeof(int)并将基址给s.baseif(!s.base) return; //分配失败s.top=s.base; s.stacksize=stackinitsize;} void push(stack &s,int e){ if((s.top-s.base)>=s.stacksize){//栈的空间不够时,再分配空间s.base=(int *)realloc(s.base,sizeof(int)*(s.stacksize+increasesize)); if(!s.base) return; //分配失败s.stacksize+=increasesize; } *s.top++=e; //*s.top=e;*s.top=*s.base+1,先将e给*s.base,再将s.top增一} int pop(stack &s,int &e){ if(s.top==s.base) return 0; //空栈返回e=*(--s.top); //先将s.top减1再将*s.top给ereturn e;}int a[maxi+2][maxj+2]={//起点为a[1][1],终点为4,曾经到过的点为2,墙壁为1,0为通路,//为2的点只能是那些为0的点,同时在矩阵的四周加一个墙便于操作。1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,    };int compare(stack &s,int i,int j)//成功走到出口返回1,否者返回0{int p,q;if(a[i][j]==4){cout<<"恭喜,该迷宫可以走出!"<<"具体步骤如下"<<endl;while(s.base!=s.top)//输出栈中的所有元素{p=*s.base++;q=*s.base++;cout<<p<<" "<<q<<""; }cout<<maxi<<" "<<maxj<<endl;return 1;}if(a[i][j]==2||a[i][j]==1)return 0;if(a[i][j]==0){a[i][j]=2;push(s,i);push(s,j);if(compare(s,i+1,j))return 1;if(compare(s,i,j+1))return 1;if(compare(s,i-1,j))return 1;if(compare(s,i,j-1))return 1;}pop(s,q); pop(s,p);a[i][j]=2;return 0;}int main(){stack s;InitStack(s);//初始化栈sfor(int i=1;i<maxi+1;i++)//输出整个迷宫{for(int j=1;j<maxj+1;j++){cout<<a[i][j];}cout<<endl;}if(!compare(s,1,1))cout<<"失败,迷宫不能走出!"<<endl;return 0;}