此程序使用了队列这一数据结构,可以根据自己的需要构造迷宫地图,可以自由定义迷宫的大小,障碍物的位置(“1”表示无障碍,“0”表示障碍),迷宫的起点和终点,根据队列找到迷宫路径,话不多说,先上代码。
#include <stdio.h>
#include <stdlib.h>
int a,b;//map大小: a*b
//定义队列指针
typedef struct Node
{
int i,j;
int pre;
struct Node *next;
}Node,*queue;
typedef struct
{
queue front;
queue rear;
}linkqueue;
//创建队列
void CreateQueue(linkqueue &q)
{
q.front=q.rear=(queue)malloc(sizeof(Node));
return ;
}
//压入队列
void push(linkqueue &q,int i,int j,int pre)
{
queue p;
p=(queue)malloc(sizeof(Node));
p->i=i;
p->j=j;
p->pre=pre;
p->next=NULL;
q.rear->next=p;
q.rear=p;
return ;
}
Node top(linkqueue &q)
{
Node p;
p.i=q.front->next->i;
p.j=q.front->next->j;
p.pre=q.front->next->pre;
return p;
}
//清空队列
int Empty(linkqueue &q)
{
if(q.front->next==q.rear->next)
return 1;
else return 0;
}
//判断队列是否为空
void pop(linkqueue &q)
{
if(Empty(q))
{
printf("error!");
return ;
}
queue p;
p=q.front->next;
q.front->next=p->next;
if(q.rear==p)
q.rear==q.front;
free(p);
return ;
}
//寻找上一个指针
int findpre(Node point[],int pre)
{
int i,j;
i=pre/b;
j=pre%b;
for(int z=0;;z++)
{
if(point[z].i==i&&point[z].j==j)
return point[z].pre;
}
}
//主函数
int main()
{
int starti,startj;//开始起点坐标
Node point[100];
int path[100];
int find=0;
int endi,endj;
int check;//遍历地图
Node next;
Node now;
int map[100][100];
//输入地图大小
printf("map size:");
scanf("%d%d",&a,&b);
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
map[i][j]=0;
}
printf("map(以(0,0)为第一个点):\n");
//输入地图
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
scanf("%d",&map[i][j]);
}
//输入起点坐标
printf("start:");
scanf("%d%d",&starti,&startj);
//输入终点坐标
printf("end:");
scanf("%d%d",&endi,&endj);
linkqueue q;
CreateQueue(q);
push(q,starti,startj,starti*b+startj);
map[starti][startj]=0;
int index=0;
while(!Empty(q))
{
now=top(q);
check=0;
point[index++]=now;
if(now.i==endi&&now.j==endj)
{
find=1;
break;
}
//遍历地图,寻找路径
for(int i=-1;i<=1;i+=2)
{
if(!map[now.i+i][now.j])
{
continue;
}
map[now.i+i][now.j]=0;
push(q,now.i+i,now.j,now.i*b+now.j);
}
for(int i=-1;i<=1;i+=2)
{
if(!map[now.i][now.j+i])
{
continue;
}
map[now.i][now.j+i]=0;
push(q,now.i,now.j+i,now.i*b+now.j);
}
pop(q);
}
//判断路径
if(find)
{
printf("path:\n");
index=0;
path[index++]=endi*b+endj;
while(path[index-1]!=starti*b+startj)
{
int np;
np=findpre(point,path[index-1]);
path[index++]=np;
}
for(int i=index-1;i>=0;i--)
printf("(%d,%d)->",path[i]/b,path[i]%b);
printf("success!\n");
}
else
printf("not find\n");
system("pause");
return 0;
}
运行程序后,根据命令行窗口提示输入:
map size: 4 4 “输入地图的大小,两个数字,中间用空格隔开”
map(以(0,0)为第一个点): “输入4 x 4的数列,数字之间用空格分隔”
1 1 0 1
0 1 1 1
1 0 1 0
1 1 1 0
start:0 0
end:3 0
path:
(0,0)->(0,1)->(1,1)->(1,2)->(2,2)->(3,2)->(3,1)->(3,0)->success!