迷宫问题(不太熟)

1.用栈解决

/*用栈求解迷宫问题*/
#include
#define maxsize 100 
typedef struct
{
	int i;  //行号 
	int j; //列号 
	int di; //方位 
}BOX;
typedef struct
{
	BOX data[maxsize];
	int top;  //栈顶 
 } stType;
 int mg[10][10]= {{1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};//地图
int M=8;//行数
int N=8;//列数
bool mgpath(int x,int y,int xe,int ye)
{
	BOX path[maxsize];
	int k=0,di=-1,i,j,find=0;
	stType s;
	s.top=-1;
	s.top++;
	s.data[s.top].i=x;
	s.data[s.top].j=y;
	s.data[s.top].di=-1;
	mg[x][y]=-1;  //将入口处的迷宫值设为-1避免重复走到该处 
	while(s.top!=-1)
	{
		di=s.data[s.top].di;//原因:若栈顶元素是第一次做栈顶则:每个栈的栈顶元素的di值均为-1 
	//若栈顶元素是第二次做栈顶即曾进栈过一个元素,但这个元素无相邻的可走方块从而回退到栈顶元素,
			//则应从目前栈顶元素di的di+1方向开始找,
			//因为刚刚di之前的已经找过路了,di方向对应的元素方块无相邻的可走方块 
		if(s.data[s.top].i==xe&&s.data[s.top].j==ye)
		{
			printf("迷宫路径如下:\n");
			while(s.top!=-1)
			{
				path[k++]=s.data[s.top];
				s.top--;
			}
			while(k>=1)
            {
            	k--;
                printf("\t(%d,%d)",path[k].i,path[k].j);
                if((k+2)%5==0)
                    printf("\n");
            }
			return true;
		}
		else 
		{
			find=0;
			while(di<=3)
			{
				printf("di1:%d\n",di);
				printf("------------\n");
				di++;
				printf("di:%d\n",di);
				if (di==1)
				{
					i=s.data[s.top].i;
					j=s.data[s.top].j+1;
				}
				else if(di==2)
				{
					i=s.data[s.top].i+1;
					j=s.data[s.top].j;
				}
				else if(di==3)
				{
					i=s.data[s.top].i;
					j=s.data[s.top].j-1;
				}
				else if(di==0)
				{
					i=s.data[s.top].i-1;
					j=s.data[s.top].j;
				}
				if (mg[i][j]==0)
				{
					s.data[s.top].di=di;
					s.top++;
					s.data[s.top].di=-1;
					s.data[s.top].i=i;
					s.data[s.top].j=j;
					find=1;
					mg[i][j]=-1; 
					break;
				}
			}
			printf("===========\n");
			if(find==0)
			{
				mg[s.data[s.top].i][s.data[s.top].j]=0;
				s.top--;
			}
		}
	 }
	 return false; 
}
int main()
{
	if(mgpath(1,1,M,N)!=true)
        printf("false!!\n");
    return 0;
}

2.用队列解决

函数:

bool mgpath(int x,int y,int xe,int ye)
{
	qutype q;
	int i,j;
	q.front=q.rear=-1; 
	q.rear++;
	q.data[q.rear].i=x;
	q.data[q.rear].j=y;
	q.data[q.rear].pre=-1;
	mg[x][y]=-1;
	while(q.rear!=-1)
	{
		q.front++;
		i=q.data[q.front].i;
		j=q.data[q.front].j;
		if (i==xe&&j==ye)
		{
			
			print(q,q.front);
			return true;
		}
		else
		{
			for(int di=0;di<4;di++)
			{
				if (di==1)
				{
					i=q.data[q.front].i;
					j=q.data[q.front].j+1;
				}
				else if(di==2)
				{
				    i=q.data[q.front].i+1;
					j=q.data[q.front].j;
				}
				else if(di==3)
				{
					i=q.data[q.front].i;
					j=q.data[q.front].j-1;
				}
				else if(di==0)
				{
					i=q.data[q.front].i-1;
					j=q.data[q.front].j;
				}
				if(mg[i][j]==0)
				{
					q.rear++;
					q.data[q.rear].i=i;
					q.data[q.rear].j=j;
					q.data[q.rear].pre=q.front;
					mg[i][j]=-1;
				}
			}
		}
	}
	return false;
}

完整代码:

 #include
#define maxsize 100 
typedef struct
{
	int i;  //行号 
	int j; //列号 
	int pre; //上一个方块的下标 
}BOX;
typedef struct
{
	BOX data[maxsize];
	int front,rear;
}qutype;
int mg[10][10]= {{1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};//地图
int M=8;//行数
int N=8;//列数
void print(qutype q,int front)
{
	printf("ok!\n");
	int k=front,k1;
	printf("k:%d\n",k);
	do
	{
	    k1=k;
		k=q.data[k].pre;
	//	printf("k:%d\n",k);
		q.data[k1].pre=-1;
	}while(k!=0);
	printf("路径如下:\n");
	for(int k=0;k

你可能感兴趣的:(数据结构)