#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.base
if(!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给e
return 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); //初始化栈s
for(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;
}
迷宫程序(5)
最新推荐文章于 2023-06-07 21:15:27 发布