迷宫问题(不太熟)

1.用栈解决

/*用栈求解迷宫问题*/
#include<stdio.h>
#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<stdio.h>
#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<maxsize;k++)
	{
		int j=0;
		if(q.data[k].pre==-1)
		{
			j++;
			printf("(%d,%d)",q.data[k].i,q.data[k].j);
			if(j%5==0)
			printf("\n");
		}
			
			
	}
}
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;
}
int main()
{
	if(mgpath(1,1,M,N)!=true)
        printf("false!!\n");
    return 0;
}

3.用递归

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct
{
	int i;
	int j;
 } Box;
 typedef struct
 {
 	Box data[maxsize];
 	int length;
 }pathtype;
 int mg[6][6]= {{1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1}
};//地图
int M=4;//行数
int N=4;//列数
int I=0;
 void mgpath(int x,int y,int xe,int ye,pathtype path)
 {
 	if(x==xe&&y==ye)
 	{
 		path.data[path.length].i=x;
 		path.data[path.length].j=y;
 		mg[x][y]=-1;
 		path.length++;
 		//printf("I:%d\n",I++);
 		for(int k=0;k<path.length;k++)
 		{
 			printf("\t(%d,%d)\t",path.data[k].i,path.data[k].j);
 		//	if((k+1)%5==0)
 		//		printf("\n");
		 }
		 printf("\n");
	 }
	 else
	 {
	 	if(mg[x][y]==0)  //[x][y]可走 
	 	{
	 		int di=0,i1,j1;
		 	while(di<4)
		 	{
			 	path.data[path.length].i=x;
		 		path.data[path.length].j=y;
		 	//	mg[x][y]=-1;
		 		path.length++;
		 		switch(di)
		 		{
		 			case 0:i1=x-1;j1=y;break;
		 			case 1:i1=x;j1=y+1;break;
		 			case 2:i1=x+1;j1=y;break;
		 			case 3:i1=x;j1=y-1;break;
				}
				mg[x][y]=-1;
				mgpath(i1,j1,xe,ye,path);
				path.length--;   //回退找不同的路径 
				mg[x][y]=0;
				di++;
		 	}
	 	}
	 }
 }
 int main()
 {
 	pathtype p;
 	p.length=0;
 	int x=1,y=1,xe=4,ye=4;
 	mgpath(x,y,xe,ye,p);
 	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值