c语言栈实现迷宫

#include<iostream>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 10000
bool val[100][100];
int mp[100][100],ne[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int x,y,m,n;
enum Status{
	OK=1,
	ERROR=0,
	OVERFLOW=-1
};
typedef struct {
	int x,y;
}map;
map mm[200][200];
void init(){
	for(int i=0;i<200;i++)
		for(int j=0;j<200;j++){
			mm[i][j].x=0;
			mm[i][j].y=0;
		}
	for(int i=0;i<100;i++)
		for(int j=0;j<100;j++){
			mp[i][j]=0;
			val[i][j]=0;
		}
}
struct SqStack{
	map *top;
	map *base;
	int StackSize;
	Status Init(SqStack &S){
		S.base=new map[MAXSIZE];
		S.top=S.base;
		S.StackSize=MAXSIZE;
		return OK;
	}
	Status push(SqStack &S,map e){
	//	cout<<e.x<<' '<<e.y<<endl; 
		if(S.StackSize==0)
			return OVERFLOW;
		S.top->x=e.x;
		S.top->y=e.y;
		S.top++;
		--S.StackSize;
		return OK;
	}
	Status pop(SqStack &S,map &e){
		if(S.StackSize==100)
			return ERROR;
		--S.top;
		e.x=S.top->x;
		e.y=S.top->y;
		++S.StackSize;
	//	cout<<"e="<<e.x<<' '<<e.y<<endl;
		return OK;
	}
	bool empty(SqStack S){
	//	cout<<"size="<<S.StackSize<<endl;
		if(S.StackSize==MAXSIZE)
			return true;
		return false;
	}
};
bool solve(int p,int q){
	map m;
	val[1][1]=true;
	m.x=1,m.y=1;
	SqStack s;
	s.Init(s);
	s.push(s,m);
//	cout<<"s"<<' '<<s.top->x<<' '<<s.top->y<<endl; 
	while(!s.empty(s)){
	//	cout<<"s.empty"<<s.empty(s)<<endl;
		map now;
		s.pop(s,now);
	//	cout<<"s,empty"<<s.empty(s)<<endl;
	//	cout<<"now.x="<<now.x<<" now.y="<<now.y<<endl;
		if(now.x==p&&now.y==q){
			return true;
		}
		for(int i=0;i<4;i++){
			int nx=now.x+ne[i][0];
			int ny=now.y+ne[i][1];
		//	cout<<"nx="<<nx<<' '<<"ny="<<ny<<endl;
			if(!val[nx][ny]&&nx>=1&&nx<=x&&ny>=1&&ny<=y&&!mp[nx][ny]){
				map nex;
				nex.x=nx;
				nex.y=ny;
		//		cout<<"nx="<<nx<<' '<<"ny="<<ny<<endl;
				s.push(s,nex);
				val[nx][ny]=true;
				mm[nx][ny].x=now.x;
				mm[nx][ny].y=now.y;
			}
		}
	}
	return false;
}
void move(int x,int y)
{
	if(x==1&&y==1)
		return ;
	move(mm[x][y].x,mm[x][y].y);
//	printf("%d %d\n",mm[x][y].x,mm[x][y].y);
	mp[mm[x][y].x][mm[x][y].y]=8;
}
int main()
{
	printf("默认入口为(1,1)请输入迷宫大小和终点坐标(1-50):\n"); 
	cin>>x>>y>>m>>n;
//	printf("输入0或1,0代表可通过1代表不可通过\n");
//	printf("输入1自己设计迷宫,输入2系统自动生成迷宫") 
	int qq=20,ff=0;
	printf("输入1自己设计迷宫,输入2选择系统自动生成迷宫:\n");
	int kk=0;
	cin>>kk;
	printf("\n");
	printf("迷宫实例如下0表示可以通过,1表示不可以通过\n");
	cout<<"0 1 1"<<endl;
	cout<<"0 0 1"<<endl;
	cout<<"0 0 0"<<endl;
	if(kk==2)
		while(!ff)
		{ 
			for(int i=1;i<=x;i++)
				for(int j=1;j<=y;j++)
					mp[i][j]=rand()%2;
			printf("系统随机生成的迷宫为\n"); 
			for(int i=1;i<=x;i++)
					for(int j=1;j<=y;j++)
						cout<<mp[i][j]<<" \n"[j==y];
			if(solve(m,n)){
				printf("ok!!!\n");
				ff=1;
				move(n,m);
				mp[n][m]=8;
				for(int i=1;i<=x;i++)
					for(int j=1;j<=y;j++)
						cout<<mp[i][j]<<" \n"[j==y];
			}
			else printf("fail!!!");
			init();
			printf("\n");
		}
	else {
		printf("请输入迷宫:\n");
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				cin>>mp[i][j];
		if(solve(m,n)){
				printf("ok!!!\n");
				printf("迷宫路径如下,用8表示:\n");
				move(n,m);
				mp[n][m]=8;
				for(int i=1;i<=x;i++)
					for(int j=1;j<=y;j++)
						cout<<mp[i][j]<<" \n"[j==y];
			}
		else printf("fail!!!");
	}
	return 0;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天热写代码不吹空调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值