队列迷宫问题

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

猜你喜欢

转载自blog.csdn.net/Happyunlimited/article/details/80953536