迷宫程序(5)

#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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值