队列迷宫问题

xiaoxiao2021-02-28  31

此程序使用了队列这一数据结构,可以根据自己的需要构造迷宫地图,可以自由定义迷宫的大小,障碍物的位置(“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 10 1 1 11 0 1 0

1 1 1 0

start:0 0end:3 0path:(0,0)->(0,1)->(1,1)->(1,2)->(2,2)->(3,2)->(3,1)->(3,0)->success!

转载请注明原文地址: https://www.6miu.com/read-2625632.html

最新回复(0)