您的位置:首页 > 其它

队列实现迷宫问题(精装版,可返回路径)

2010-04-16 14:50 316 查看
#define MaxSize 100
#include <stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef struct Elem
{//定义元素数据结构类型
int x;
int y;
int pre;
}Elem;

typedef struct
{
Elem num[MaxSize];//指针数组
int front;
int rear;
//int tag; //front==rear时表示队列满或空的标志:tag==1表示满,tag==0表示空
}LinkQueue;

LinkQueue InitQu(LinkQueue *q)
{
q=(LinkQueue *)malloc(sizeof(LinkQueue));//分配空间
q->front=0;
q->rear=0;
return *q;
}
Elem Delet(LinkQueue *q)
{
return q->num[++(q->front)];
}
LinkQueue EnQueue(LinkQueue *q,int i,int j)//为存入将下一个初始化为(,)
{ q->num[q->rear].pre=q->front;
q->num[q->rear].x=i;
q->num[q->rear].y=j;
q->rear=q->rear+1;
q->num[q->rear].x=0;
q->num[q->rear].y=0;
q->num[q->rear].pre=0;
return *q;
}

int JudguEnd(LinkQueue &Q)
{
if(Q.front>Q.rear) return 0;

}

void FIND(LinkQueue Q)
{ int a[10][10]=
{
0,0,0,0,0,0,0,0,0,0,//0
0,1,1,0,1,1,1,0,1,0,//1
0,1,1,0,1,1,1,0,1,0,//2
0,1,1,1,0,0,0,1,1,0,//3
0,1,0,0,0,1,1,1,1,0,//4
0,1,1,0,0,1,1,1,1,0,//5
0,1,1,1,1,1,0,1,1,0,//6
0,1,0,0,0,1,0,0,1,0,//7
0,0,1,1,1,1,1,1,1,0,//8
0,0,0,0,0,0,0,0,0,0 //9
};
int i=1;
int j=1;
EnQueue(&Q,i,j);
int dx[]={ 1,-1, 0, 0 };//定义两个数组作为坐标循环,使代码简化,
int dy[]={ 0, 0, 1,-1 };

for(int k=0;JudguEnd(Q)!=0;)//一个循环使(i,j)组合的四种情况都具备了
{

if(a[i+dx[k%4]][j+dy[k%4]]==1)
{
EnQueue(&Q,i+dx[k%4],j+dy[k%4]);
a[i+dx[k%4]][j+dy[k%4]]=2;
}

if(i+dx[k%4]==8&&j+dy[k%4]==8)
{
i=i+dx[k%4];j=j+dy[k%4];break;
}
k++;
if (k%4==0)
{
Elem e=Delet(&Q);//定义一个元素类型e,接收Delet(&Q)类型的返回值
i=e.x;
j=e.y;;
}
}
if(i==8&&j==8)
{
printf("此迷宫可通,通路为:/n");
int n=Q.rear-1;
Elem b[100];
int m=-1;
for(;n!=0;)
{
m++;
b[m].x=Q.num
.x;
b[m].y=Q.num
.y;
n=Q.num
.pre;

}
printf("(%d,%d) ",Q.num[0].x,Q.num[0].y);
for(;m+1!=0;)
{
printf("-> (%d,%d) ",b[m].x,b[m].y);
m--;
}
}
else
{
printf("此迷宫不可通");
}
}

void main()
{
LinkQueue Q;
Q=InitQu(&Q);
FIND(Q);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: