迷宫问题的非递归解

问题描述:求迷宫中从一个入口到出口的所有路径是一个经典的程序设计问题。由于计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索,直到所有可能的通路都探索到为止;假如所有可能的通路都探索到而未能到达出口,则所假定的迷宫没有解
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct 
{
	int x,y;
}items;//
   
typedef struct 
{
	int x,y,d;
}Datetype;//定义移动move

typedef struct 
{
	Datetype data[MAX];
	int top;//
}SeqStack,*PSeqStack;
//创建一个空栈
PSeqStack Init_Seqstack()
{
	PSeqStack S;
	S=(PSeqStack )malloc(sizeof(SeqStack));
	if(S )
		S->top=-1;//
	return S;
}
int Empty_Seqstack(PSeqStack S)
{//
	if(S->top==-1)
		 return 1;
	else
		return 0;
}
int Push_Seqstack(PSeqStack S,Datetype  x)
{//
	if(S->top==MAX-1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top]=x;
		return 1;
	}
}
int Pop_Seqstack(PSeqStack S,Datetype  *x)
{//
	if(Empty_Seqstack(S))
		return 0;
	else
	{
		*x=S->data[S->top];
		S->top--;
		return 1;
	}
}
int Gettop_Seqstack(PSeqStack S,Datetype  *x)
{//
	if(Empty_Seqstack(S))
		return 0;
	else
		*x=S->data[S->top];
	return 1;
}
void Destroy_seqstack(PSeqStack *S)
{//
	if(*S)
		free(*S);
	*S=NULL;
	return ;	
}
#include<stdio.h>
#include<stdlib.h>
#include"head.h"
#define m 6
#define n 8
//
int mazepath(int maze[][n+2],items move[],int x0,int y0)
{//求解迷宫问题主要程序,maze代表迷宫,x0,y0代表入口
	PSeqStack S;
	Datetype temp;
	int x,y,d,i,j;
	temp.x=x0;
	temp.y=y0;
	temp.d=-1;
	S=Init_Seqstack();
	if(!S)
	{
		printf("error!");
		return 0;
	}
	Push_Seqstack(S,temp);
	
	while(!Empty_Seqstack(S))
	{
		Pop_Seqstack(S,&temp);
		x=temp.x;
		y=temp.y;
		d=temp.d+1;
       while(d<4)
	   {
		   i=x+move[d].x;
		   j=y+move[d].y;
		   if(maze[i][j]==0)//如果这条路可以走
		   {
			   temp.x=x;
			   temp.y=y;
			   temp.d=d;
			   Push_Seqstack(S,temp);//压入栈中
			   x=i;y=j;maze[x][y]=-1;//
			   if(m==x&&n==y)//如果到达出口
			   {
				   while(!Empty_Seqstack(S))
				   {
					   Pop_Seqstack(S,&temp);//出站
					   printf("->(%d,%d)",temp.x,temp.y);//打印路径
				   }
				   Destroy_seqstack(&S);
				   return 1;//
			   }
			   else
				   d=0;//从新的路开始走
		   }
		   else
			   d++;//找下一个路径		   
	   }
	}
	Destroy_seqstack(&S);
	return 0;
}
int main()
{
//	int migong[m+2][n+2];
	int i,j;
	items move[4];
   move[0].x=0;
   move[0].y=1;
   move[1].x=1;
   move[1].y=0;
   move[2].x=0;
   move[2].y=-1;
   move[3].x=-1;
   move[3].y=0;
 int   migong[m+2][n+2]={
	{1,1,1,1,1,1,1,1,1,1},
   {1,0,0,0,1,0,1,1,0,1},
   {1,0,0,0,1,1,1,1,0,1},
   {1,0,0,0,0,0,1,1,0,1},
   {1,0,0,0,1,0,0,1,0,1},
   {1,0,0,0,0,0,1,0,0,1},
   {1,0,0,0,1,0,0,0,0,1},
   {1,1,1,1,1,1,1,1,1,1}
   };
   mazepath(migong,move,1,1);
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值