栈和队列解决迷宫问题

#include<stdio.h>
#define M 8//行数
#define N 8//列数
#define maxsize 100//栈最多元素个数 
int mg[M+2][N+2]={      //一个迷宫,其四周要加上均为1的外框
                    {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}
};
struct labyrinth
{
	int i;//横坐标
	int j;//列坐标
	int di;//方向 
 }stack[maxsize],path[maxsize];//存放栈和最短路径的数组
 int top=-1;//栈顶指针
 int count=1;//路径数
 int minlen=maxsize;//最短路径长度
 void labypath();
 int main()
 {
 	printf("所有路径如下:\n");
 	labypath();
  } 
void labypath()
{
	int i,j,di,find,l;
	top++;
	stack[top].i=stack[top].j=1;//初始坐标
	stack[top].di=-1;
	mg[1][1]=-1;//初始点进栈
	while(top>-1)//栈不空时循环
	{
		i=stack[top].i;
		j=stack[top].j;
		di=stack[top].di;
		if(i==M&&j==N)
		{
			printf("M:  ",count++);
			for(l=0;l<=top;l++)
			{printf("(%d,%d)   ",stack[l].i,stack[l].j);
			if((l+1)%5==0)
			printf("\n");}
		printf("\n");
		if(top+1<minlen)//最短路径
		{
			for(l=0;l<=top;l++)
			path[l]=stack[l];	
			minlen=top+1;
			 } 
			 mg[stack[top].i][stack[top].j]=0;//恢复通行
			 top--;
			 i=stack[top].i,j=stack[top].j,di=stack[top].di; 
		}
	 find=0;
	 while(di<4&&find==0)
	 {
	 	di++;
	 	switch(di){
                case 0:i=stack[top].i-1;j=stack[top].j;break;   //上面
                case 1:i=stack[top].i;j=stack[top].j+1;break;   //右边
                case 2:i=stack[top].i+1;j=stack[top].j;break;   //下面
                case 3:i=stack[top].i;j=stack[top].j-1;break;   //左边
            }
        if(mg[i][j]==0)
            find=1;
        }
        if(find==1)
        {
        	stack[top].di=di;
        	top++;//下一个元素进栈 
        	 stack[top].i=i;
            stack[top].j=j;
            stack[top].di=-1;
            mg[i][j]=-1;//避免走重复元素     
		}
		else
		{
			 mg[stack[top].i][stack[top].j]=0;   //让该位置变为其他路径的可走结点
            top--;
		 }}
		  printf("最短路径如下:\n");
    printf("长度:  %d\n",minlen);
    printf("路径:  ");
    for(l=0;l<minlen;l
	++){
        printf("(%d,%d)  ",path[l].i,path[l].j);
        if((l+1)%5==0)      //输出时每5个结点换一行
            printf("\n\t");
    }
    printf("\n");
	 }

队列

#include<stdio.h>
#define M 8
#define N 8
#define maxsize 100
int mg[M+2][N+2]=
{
    {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}
};
typedef struct
{
	int i;//横坐标 
	int j;//纵坐标
	int pre;//本路径中上一方块在该路径中的位置 
}box;//方块类型
typedef struct
{
	box data[maxsize];//路径坐标
	int front,rear;//队头、队尾指针 
 }QU;
void labyrinth(int xi,int yi,int xe,int ye); 
void print(QU qu,int front);
int main()
{
	labyrinth(1,1,M,N);
  } 
void  labyrinth(int xi,int yi,int xe,int ye)
{
	int i,j,di;
	int find=0;
	QU qu;
	qu.front=qu.rear=-1;
	qu.rear++;
	qu.data[qu.rear].i=xi;
	qu.data[qu.rear].j=yi;
	qu.data[qu.rear].pre=-1;
	mg[xi][yi]=-1;
	while(qu.front!=qu.rear&&!find)//队列非空且未找到路径时
	{
		qu.front++;
		i=qu.data[qu.front].i;
		j=qu.data[qu.front].j;
		if(i==M&&j==N)//找到路径
		{
		find=1;
		print(qu,qu.front); 
	 }
	 for(di=0;di<4;di++)
	 {
	 	switch(di)
	 	{
	 		case 0:
	 			i=qu.data[qu.front].i-1;//上
	 			j=qu.data[qu.front].j;
				break;
			case 1:
			 	i=qu.data[qu.front].i+1;//下
				j=qu.data[qu.front].j;
				break;
			case 2:
			    i=qu.data[qu.front].i;//左
				j=qu.data[qu.front].j-1;
				break;
			case 3: 
			    i=qu.data[qu.front].i;//右
				j=qu.data[qu.front].j+1;
				 break;
		 }
		 if(mg[i][j]==0)
		 {
		 	qu.rear++;
		 	qu.data[qu.rear].i=i;
            qu.data[qu.rear].j=j;
            qu.data[qu.rear].pre=qu.front;
            mg[i][j]=-1;
		 }	 
	  }
	  find=0; 
}}
void print(QU qu,int front)
{
	int k,j,ns=0;
	k=front;
	do{
		j=k;
		k=qu.data[k].pre;
		qu.data[j].pre=-1;
	}while(k!=0);
	 printf("迷宫路径如下:\n");
    k=0;
    while (k<=front)  //正向搜索到pre为-1的方块,即构成正向的路径
    {
        if (qu.data[k].pre==-1)
        {
            ns++;
            printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j);
            if (ns%5==0)
                printf("\n");   //每输出每5个方块后换一行
        }
        k++;
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值